算法之快慢指针

9 篇文章 2 订阅

删除有序数组中的重复项

26. 删除有序数组中的重复项
在这里插入图片描述
这道题我们尝试使用快慢指针来解题:
快指针在前面进行对数组元素的遍历,慢指针判断,如果与快指针所指的元素不同,那么指针向右移动,然后进行赋值,最后新数组的长度等于慢指针的索引加1。
在这里插入图片描述

//这里我们使用快慢指针
/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
	if(nums.length === 0) return 0;
	let slow = 0;
	let fast = 0;
	while(fast < nums.length){
		if(nums[fast] != nums[slow]){
			slow++;
			nums[slow] = nums[fast];
		}
		fast++;
	}
	return slow+1;
}

删除排序链表中的重复元素

83. 删除排序链表中的重复元素
在这里插入图片描述

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var deleteDuplicates = function(head) {
    if(head == null) return head;
    let slow = head;
    let fast = head;
    while(fast != null){
        if(slow.val != fast.val){
            slow.next = fast;
            //slow++
            slow = slow.next;
        }
        //fast++
        fast = fast.next;
    }
    //断开与后面重复元素的连接 !!!
    slow.next = null;
    return head;
};

移除元素

27. 移除元素
在这里插入图片描述

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    if(nums.length == 0) return 0;
    let slow = 0;
    let fast = 0;
    while(fast < nums.length){
        if(nums[fast] != val){
        //这里有一个细节,就是我们在对num[slow]赋值完以后再对slow++,保证nums[0..slow-1]是不包含val的元素
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
};

移动零

283. 移动零
在这里插入图片描述
这道题,有多种解法
我们针对快慢指针,可以这么想,将0移到后面,其实就是移除nums中的所有0,然后再把后面的元素都赋值为0即可。

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
	//去除nums中所有0,返回不含0的数组长度
    let p = removeElement(nums,0);
    for(;p < nums.length;p++){
        nums[p] = 0;
    }
};
function removeElement(nums, val){
    if(nums.length == 0) return 0;
    let slow = 0;
    let fast = 0;
    while(fast < nums.length){
        if(nums[fast] != val){
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
};
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值