zoukankan      html  css  js  c++  java
  • 1. Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    You may assume that each input would have exactly one solution, and you may not use the same element twice.

    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

    题目链接:https://leetcode.com/problems/two-sum/description/

    解法一:两重循环遍历数组(时间复杂度:O(n²))

    解法二:1.用map来存放,键值为数组的值,实值为个数,

        2.遍历数组,用find查找是否存在我们要找的值(target - nums[i]),找到判断是否与nums[i]相等,相等则判断是否有两个同样的值

        3.最后记录下标值的时候,要注意当找到的两个值相等的时候,不能记录为相同的,要记录下一个

        时间复杂度O(nlog(n)),其中O(log(n))为map容器产生

        vector<int> twoSum(vector<int>& nums, int target) {
            int length = nums.size();
            vector<int> vec;
            map<int , int> simap;
            int num = 0;
            for(int i = 0; i < length; i++)
                simap[nums[i]] ++;
            for(int i = 0; i < length; i++)
            {
                num = target - nums[i];
               if(simap.find(num) != simap.end())//找到了
               {
                   if(nums[i] == num && simap[num] == 1)//同一个值
                       continue;
                   vec.push_back(i);
                   break;
               }
            }
            if(vec.size() != 0)//找到了和为target的两个数
            {
                for(int i = 0; i < length; i++)
                    if(nums[i] == num)
                    {
                        if(vec[0] == i)
                            continue;
                        vec.push_back(i);
                         break;
                    }
            }
            return vec;
        }

    解法三:1.vec存储pair类型,分别为数组的值和下标,

        2.存储完后用sort进行排序,

        3.用迭代器遍历数组,调用lower_bound函数,查找另一个值(target - ite->first)

        时间复杂度(O(nlog(n)))

        vector<int> twoSum(vector<int>& nums, int target) {
            int length = nums.size();
            vector<pair<int , int> > vec;
            vector<int> res;
            for(int i = 0; i < length; i++)
            {
                vec.push_back(make_pair(nums[i],i));
            }
            sort(vec.begin(),vec.end());
            vector<pair<int , int>>::iterator tmp,i,ite = vec.begin();
            while(ite != vec.end()) 
            {
                auto tm = next(ite, 1);
                i = lower_bound(tm,vec.end(),make_pair(target - (ite->first), 0), [](const pair<int, int> & a, const pair<int, int> & b) -> bool
                                            { 
                                                return a.first < b.first; 
                                            });
                if(i!=vec.end()&&i->first + ite->first == target)
                {
                    res.push_back(ite->second);
                    res.push_back(i->second);
                    break;
                }
                ite ++;
            }
            return res;
        }
  • 相关阅读:
    Redis使用:聚合类型为空时,会自动被Redis删除
    Effective C++: 04设计与声明
    select引起的服务端程序崩溃问题
    Effective C++: 03资源管理
    Effective C++: 02构造、析构、赋值运算
    Effective C++: 01让自己习惯C++
    Centos7.2 安装配置 Tengine(nginx)
    Centos7更新阿里yum源
    Go中函数作为值、类型传递。
    go实现冒泡排序和快速排序
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8367624.html
Copyright © 2011-2022 走看看