167. Two Sum II - Input array is sorted

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] outcome=new int[2];
        int outlp;
        outlp=Integer.MAX_VALUE;
        for(int i=0;i<numbers.length;i++){
            if(numbers[i]==outlp) continue;
            else outlp=numbers[i];
            for(int j=i+1;j<numbers.length;j++){
                if(numbers[i]+numbers[j]==target){
                    outcome[0]=i+1;
                    outcome[1]=j+1;
                    return outcome;
                }
            }
        }
        return outcome;
    } 
}
我的做法其实还是n2的复杂度,但是因为他的case很多是这样的[0,0,0,0…1,2]这样,所以跳过前面的重复项就能pass,目前我想到的一个改进方案是在此基础上,内部循环的判断用二分查找,就能把复杂度降到n*longn。

忽然灵光一闪,外层和内层都用二分查找可以吗?

nlogn的方法:外层首先取倒数第二大的数,然后对右边的数组进行二分查找,如果第一个和就大于target,外层-1,否则内层折半,直到内层循环结束,外层-1。


下面这个方法我也思考到了,但是没有细想……傻逼了
OA:
class Solution { public int[] twoSum(int[] numbers, int target) { int left=0,right=numbers.length-1; while(left<right){ int comp = numbers[left]+numbers[right]; if(comp==target){ return new int[]{left+1,right+1}; }else if(comp>target){ right--;//这是唯一减小comp的方法 }else{ left++;//这是唯一增大comp的方法,so it works } } return null; } }


评论

此博客中的热门博文

225 Implement Stack using Queues

20. Valid Parentheses

232. Implement Queue using Stacks