双指针笔记 xx0

算法:双指针

 

练习题Ⅰ:删除有序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。(题目来源:LC)

解题思路:快慢指针

 

有序数组,定义双指针,第一为寻找有序数组中的无序元素,第二为无序元素赋值。

 

Java代码:

class Solution {
public int removeDuplicates(int[] nums) {
    //寻找数组长度,定义一个变量arr,赋值为数组长度
    int arr = nums.length;
    //如果数组长度为0,则直接返回0
    if(arr == 0){
        return 0;
    }

    //设置双指针
    int fast = 1; // fast为寻找有序数组中的异常量
    int slow = 1; // slow为有序数组赋值

    //fast寻找有序数组中元素的异项,slow为有序数组赋值
    while(fast<arr){ // 定义执行fast的边界
    if(nums[fast] != nums[fast-1]){
    nums[slow] = nums[fast];
        slow++;
        }
        fast++;
    }
    //返回slow
    return slow; 
    }
}

 


练习题Ⅱ:

给你一个数组 nums 和一个值 val ,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。(题目来源:LC)

解题思路:对撞指针

 

左右两个指针分别进行数组的查找。当 left 指针查找到的数字与 val 相等时,将数组中 right 指针指向的数字赋值给 left 指针指向的数字,进行覆盖。观察后发现:

 

JAVA代码:

class Solution {
    public int removeElement(int[] nums, int val) {
    int left = 0,
    int right = nums.length - 1;

    while (left <= right) {
       if (nums[left] == val) {
        nums[left] = nums[right];
        right--;
     }else {
       left++;
            }
        }
       return left;
    }
}

 

posted @ 2021-11-07 18:22  愿你一生干净纯洁  阅读(56)  评论(0)    收藏  举报