笔记 算法课(Java):11月2日 双指针模型

算法:双指针 

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

给你一个有序数组 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++;
        }
        return slow;                        //返回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;
    }
}

(麻了,上个月讲的双指针,一直没搞明白对撞指针的逻辑唉。感觉自己写的没问题,但是就是执行错误,底层逻辑错误……现在也还没搞懂自己哪里出问题了,让我在反思一下再来修改笔记好了。刷题去了qaq)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值