美文网首页
leetcode 167

leetcode 167

作者: 卖西瓜的西瓜皮 | 来源:发表于2018-05-09 21:12 被阅读0次

    坑炸了,想速度快一点,想着用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;
                }
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:leetcode 167

          本文链接:https://www.haomeiwen.com/subject/gdnorftx.html