leetcode 167

坑炸了,想速度快一点,想着用hash解决,这样避免用O(n2)循环嵌套

中途遇到的坑

  • 数组可能有负数(这个我想到了,为了使用hash,需要进行一次遍历进行转化)
  • 如果存在负数,就需要数组化为全是正数,注意加上第一个数的绝对值即可,因为升序排列,但是target是由两个数相加得到的,所以需要加双倍的第一个数的绝对值
  • 一个元素不能使用两次,这个是需要加限制的,如果hash表里面显示的index和当前index相同,需要continue,但是这是建立在当前值加在hash表里之后再作判断才会发生的状况,就是当前值3做判断,因为hash表里还没录入当前值3信息,就可以避免这种情况【(2,3,4):6】
  • 一个元素不能使用两次,但是可能出现两个相同数值的元素【(0,0,1,2):0】,这个坑在如果先将当前值加在hash表里之后再作判断会发生,就是检测到第二个零,先更新hash表就会将原来的0给抹掉,再做加和判断就不对了
class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> ans;
        if(numbers[0] < 0)
        {
            int a = numbers[0];
            for(int i = 0; i < numbers.size(); i++)
            {
                numbers[i] -= a; 
            }
            target = target  - (2*a);
        }
        
        int * A = (int *)malloc((target + 1) * sizeof(int));
        for(int i = 0; i <= target;i++)
        {
            A[i] = -5;
        }
        for(int i = 0; i< numbers.size(); i++)
        {
            if(A[target - numbers[i]] != -5)
            {
          //      if(A[target - numbers[i]] == i + 1)
            //    {
              //      continue;
              //  }
                ans.push_back(A[target - numbers[i]]);
                ans.push_back(i+1);
                return ans;
            }
            if(numbers[i] <= target)
            {
                A[numbers[i]] = i + 1;
            }
        }
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容