准备用java开始刷算法了…但有点暗了,但没事,俗话说:"一棵树种植的最好时机是二十年前,其次是现在 "。
两数之和
自己的解法:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] b= new int[2];
int a = nums.length;
for(int i=0;i<a-1;i++){
for(int j=i+1;j<a;j++){
if(nums[i]+nums[j]==target){
b[0]=i;
b[1]=j;
}
}
}
return b;
}
}
优解
这些算法不看不知道,一看真的吓一跳,真的太棒了
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums == null || nums.length < 2) {
return new int[] {
};
}
Map<Integer, Integer> map = new HashMap<>();
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int ln0 = nums[left];
int rn0 = nums[right];
int ln1 = target - ln0;
int rn1 = target - rn0;
if(map.containsKey(ln1)) {
return new int[] {
left, map.get(ln1)};
}
else {
map.put(ln0, left++);
}
if(map.containsKey(rn1)) {
return new int[] {
right, map.get(rn1)};
}
else {
map.put(rn0, right--);
}
}
return new int[] {
};
}
}
这个算法利用了map,然后指定了左右的两个指针,两边同时开工,ln0为左边的第一个数,rn0为右边的第一个数, ln1和rn1是分别要取map中找的数据,如果map中包含了ln1和rn1的其中一个就直接可以返回结果了,如果没找到则左边的往左进一步则加1,右边的指针往右边走一步,则减1,至到left<=right结束。
总结
经过这道题,我觉得用map好爽呀,但我现在的固定思维就完全没有考虑过map,在以后的题中,我一定会把map这个思想加入到我的脑海中,还有两个左右指针同时开工,这也是非常好的思想。