一、两数之和
1、采用双层循环
public int[] twoSum(int[] nums, int target) {
int n=nums.length;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j};
}
}
}
return new int[0];
}
2、采用hash表方法
public int[] twoSum(int[] nums, int target) {
int n=nums.length;
Map<Integer,Integer> hashtab=new HashMap<Integer,Integer>();
for(int i=0;i<n;i++){
if(hashtab.containsKey(target-nums[i])){
return new int[]{hashtab.get(target-nums[i]),i};
}
hashtab.put(nums[i],i);
}
return new int[0];
}
遍历nums数组,依次put到hashtab里,中途判断hashtab里是否含有可以使加上nums[i]等于target的值,如果有get其下标并返回。
二、三数之和
public List<List<Integer>> threeSum(int[] nums) {
int n=nums.length;
Arrays.sort(nums);
List<List<Integer>> res=new ArrayList<List<Integer>>();
for(int first=0;first<n;first++){
if(first>0&&nums[first]==nums[first-1]){
continue;
}
int target=-nums[first];
int third=n-1;
for(int second=first+1;second<n;second++){
if(second>first+1&&nums[second]==nums[second-1]){
continue;
}
while(second<third&&nums[second]+nums[third]>target){
third--;
}
if(second==third){
break;
}
if(nums[second]+nums[third]==target){
List<Integer> list=new ArrayList<Integer>();
list.add(nums[first]);
list.add(nums[second]);
list.add(nums[third]);
res.add(list);
}
}
}
return res;
}
本题思路:nums数组排好序,首先把nums[first]看成一部分,nums[second]+nums[third]看成一部分target=-nums[first],这样我们就可以依照循环,规定first,second,third索引先后顺序,退出循环条件,最后找到nums[second]+nums[third]=-nums[first]处返回即可。