leetcode15
三数相加问题
一开始先讲数组排序好,然后用双指针解决问题 当i+nums[l]+nums[r]等于0时就创建一个新的list把这三个数字添加进去,最后再加入lists中
其中l等于i+1;r为nums.length - 1 所以当nums[i]大于0时就直接返回lists,如果前一个和后一个相等则继续向后
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> lists = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
if(nums[i] > 0){
return lists;
}
if(i > 0 && nums[i] == nums[i - 1]){
continue;
}
int cur = nums[i];
int l = i + 1;
int r = nums.length - 1;
while(l < r){
int temp = cur + nums[l] + nums[r];
if(temp == 0){
List<Integer> list = new ArrayList<>();
list.add(cur);
list.add(nums[r]);
list.add(nums[l]);
lists.add(list);
l++;
r--;
while(l < r && nums[l] == nums[l - 1]){
l++;
}
while(l < r && nums[r] == nums[r + 1]){
r--;
}
}else if(temp > 0){
r--;
}else{
l++;
}
}
}
return lists;
}
}
leetcode80 删除有序数组中的重复项||
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
双指针法:
因为题目中要求每个元素最多出现两次所以从角标index=2时遍历,因为时有序看是否比他前两个大,如果大
就把值赋给index,并且index++;
class Solution {
public int removeDuplicates(int[] nums) {
int index = 2;
for(int i = index; i < nums.length; i++){
if(nums[i] > nums[index - 2]){
nums[index++] = nums[i];
}
}
return index;
}
}