删除有序数组的重复项

image.png
image.png
本题需要判断前一个元素和当前元素是否相同,可以用到双指针,又因为需要通过右边指针往右的移动情况来决定左边指针是否需要往右移动,所以可以使用快慢指针

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int slow=0;
  4. for(int fast=1;fast<nums.length;fast++){
  5. if(nums[slow]!=nums[fast]){
  6. slow++;
  7. nums[slow]=nums[fast];
  8. }
  9. }
  10. return slow+1;
  11. }
  12. }

移除元素

image.png
思路一样

  1. class Solution {
  2. public int removeElement(int[] nums, int val) {
  3. int slow=0;
  4. for(int fast=0;fast<nums.length;fast++){
  5. if(nums[fast]!=val){
  6. nums[slow]=nums[fast];
  7. slow++;
  8. }
  9. }
  10. return slow;
  11. }
  12. }

删除有序数组中的重复项 II

image.png
这道题不同的地方是,每个元素最多出现两次,那么我们还是用快慢指针,因为数组是有序的,所以如果fast指针和slow指针值相同,且和slow-1的位置相同,那么肯定是出现3次了,如果slow-1位置不相同,那肯定还没出现3次,因为是有序的数组,重复的元素肯定是放在一起的。

  1. class Solution {
  2. public int removeDuplicates(int[] nums) {
  3. int slow=1;
  4. for(int fast=2;fast<nums.length;fast++){
  5. if(nums[fast]!=nums[slow]||nums[fast]!=nums[slow-1]){
  6. slow++;
  7. nums[slow]=nums[fast];
  8. }
  9. }
  10. return slow+1;
  11. }
  12. }