数组中去重或去除某一固定的数 ----双指针
LeetCode .27 移除元素
题目描述:
给你一个数组 nums 和一个值 val,你需要 **原地 **移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
示例 2:
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
分析:
根据题目要求 原地,这样就不能另开一个空间安放数组。这种问题我们利用双指针解决。
class Solution {
public int removeElement(int[] nums, int val) {
int front=0;//前指针
for(int back=0;back<nums.length;++back){
if(nums[back]!=val){
nums[front]=nums[back];//不等则覆盖前面的val
++front;
}
}
return front;
}
}
LeetCode.26 删除有序数组中的重复项
题目描述:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
分析:
本题的要求与上一题一样,原地,O(1)额外空间。与上一题使用同样的方法。
class Solution {
public int removeDuplicates(int[] nums) {
int front=0;
for(int back=1;back<nums.length;++back){
if(nums[back] != nums[front]){
nums[front+1] = nums[back];
++front;
}
}
return front+1;
}
}