自己的思路:采用双指针,先将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];
暂无评论