算法通关村——双指针的妙用

个人总结:

快慢型指针特点、模板:元素被覆盖,而不是交换,留下的数组顺序与与原序列一致
对撞型指针特点、模板:元素被交换,留下的数组顺序不一定和原序列一致

删除元素专题:

1.leetcode第27题:原地移除所有值等于val的元素
leetcode27

     * 方法1:使用快慢型双指针
     *
     * @param nums
     * @param val
     * @return
     */
    public static int removeElement(int[] nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        //最后剩余元素的数量
        return slow;
//方法2:对撞型双指针
public static int removeElement2(int[] nums, int val) {

//        3, 3, 3, [], []
        int right = nums.length - 1;
        int left = 0;
        //为什么是left<=right  再让left加1因为left从0开始的 当left==right时 left及其左侧元素为移除后的元素
        for (left = 0; left <= right; ) {
            if ((nums[left] == val) && (nums[right] != val)) {
                int tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;

            }

            if (nums[left] != val) {
                left++;
            }
            if (nums[right] == val){
                right--;
            }

        }
        return left ;
/**
     * 方法三:优化对撞型双指针
     * @param nums
     * @param val
     * @return
     */
    public static int removeElement3(int[] nums, int val) {
        int right = nums.length-1;
        for (int left = 0; left < right; ) {
            if (nums[left] == val) {
                nums[left] = nums[right ];
                right--;
            } else {
                left++;
            }
        }
        return right;
    }

2.leetcode26题:删除有序数组中的重复项
leetcode26题

public static int removeDuplicates(int[] nums) {
        //slow表示可以放入新元素的位置,索引为0的元素不用管
        //第一个元素忽略
        int slow = 1;
        //循环起到了快指针的作用
        for (int fast = 0; fast < nums.length; fast++) {
            if (nums[fast] != nums[slow - 1]) {
                nums[slow] = nums[fast];
                slow++;
            }
            //把不等于slow-1的元素移到slow-1那里 然后slow++ 数不重复的元素的个数
        }
        return slow;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值