自己的思路:采用双指针,先将nums[]进行排序,左指针指向最小的数,右指针指向最大的数(n-1),如果left+right==target就跳出循环,如果left+right<target,说明就是数小了,左指针就后移一位,如果left+right>target,说明数大了,右指针就前移一位.这样就找到了目标的两个数,再在原来的数组中寻找着两个数的小标.

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int left = 0,right=0;
        int n=nums.length;
        int leftIndex;
        int rightIndex;
        int TempNums[] = nums.clone();
        int num[] = new int[2];
        boolean flag = true;
        Arrays.sort(TempNums);
        System.out.println("tempnums;"+ Arrays.toString(TempNums));
        for(leftIndex=0,rightIndex=n-1;leftIndex<rightIndex;){
            left=TempNums[leftIndex];
            right=TempNums[rightIndex];
            if(left+right==target){    //left+right如果相等,就算找到了他们,跳出循环
                break;
            }
            else if(left+right<target){
                leftIndex++;
                continue;
            }
            else if(left+right>target){
                rightIndex--;
                continue;
            }
        }
        for(int i=0;i<n;i++){
            if(nums[i]==left&&flag){  //如果right和left相同,就需要用flag来获取他们的下标
                num[0]=i;
                flag=false;
                continue;
            }
            if(nums[i]==right){
                num[1]=i;
            }
        }
return num;
}

分析:这种方法虽然时间复杂度只有O(n)但是其中的if判断太多了,同样达不到效果.不过知道了原来复制一个数组不能单纯的只是,int a[] = b,这样只是让a数组和b数组有相同的内存地址,a的改变也会改变b,所以用int a[] = b.clone();就可以只是复制b里面的内容了.

然后再来看看官方的解题思路: 采用Hashmap来存贮键值对,通过对nums进行for循环查找看有没有包含target-x的值,如果有说明就找到了x+i = target,就返回一个新的数组(target-x,i) 如果没有就把i放到map里面.

Map<Integer,Integer> integerMap = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(integerMap.containsKey(target-nums[i])){
return new int[]{integerMap.get(target-nums[i]),i};
}
integerMap.put(nums[i],i);
}
return new int[0];