两数之和
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length-1;i++) {
for(int j=i+1;j<nums.length;j++) {
if(nums[i] + nums[j] == target) {
return new int[] {i,j};
}
}
}
return new int[] {};
}
}
三数之和
1.对数组进行排序
2.对数组排序完后使用for循环遍历数组,判断nums[i]是否大于0,如果true则直接返回lists,因为前面的元素都大于0了,那么相加后面的数也是大于0 的
3.在i > 0 且nums[i] == nums[i-1] 时,直接跳出本次循环,因为前面的当前元素如果等于前一个元素的话,前一个已经执行过了,没必要再执行一次
4.定义第二个相加数为L = i+1,第三个相加数为R = len-1,R > L;
5.判断三个数相加的结果
等于0:添加进集合中,判断第二个相加数和第三个相加数是否和下一位置重复,去除重复解,并且将这两个相加数移到下一个位置
大于0:说明nums[R]太大,向左移
小于0:说明nums[L]太小,向右移
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
for(int i = 0;i < len-2;++i) {
if(nums[i] > 0) return lists;
if(i > 0 && nums[i] == nums[i-1]) continue;
int L = i+1;
int R = len-1;
while(L < R) {
int tmp = nums[i] + nums[L] + nums[R];
if(tmp == 0) {
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[L]);
list.add(nums[R]);
lists.add(list);
while(L < R && nums[L+1] == nums[L]) ++L;
while(L < R && nums[R-1] == nums[R]) --R;
++L;
--R;
} else if(tmp < 0) {
++L;
} else {
--R;
}
}
}
return lists;
}
}