一些小众算法

1.摩尔投票

在一些候选人中选出得票最多的那个,分为两个阶段:

  1. 对抗阶段:分属两个候选人的票数进行两两对抗抵消
  2. 计数阶段:计算对抗结果中最后留下的候选人票数是否有效
    可看例题:力扣169:多数元素
// 伪代码
major = arr[0]  // 保存当前票数最多候选人,初值为第一个候选人
count = 1   // 当前最多候选人票数
循环剩下的候选人:
	arr[i]当前候选人 != major:  
		count--
	arr[i]当前候选人 == major:
	    count++

	最多候选人票数 count == 0:
		major = arr[i]		// 更新候选人
		count = 1			// 更新票数

2.双指针的使用

移除元素

要在原地修改或查找数组时,可以使用双指针,根据两个指针在不同的情况下改变,实现修改或查找数组。因为规定了不能使用额外的辅助数组,且不能使用splice删除数组那样下标值就改变了,也就是说此时遍历中的索引i已经是下一个了,会跳过一个,对于这一点不能理解的,建议自己先使用遍历+splice试一下。

var removeElement = function(nums, val) {
   
    // 使用两个指针一起移动,快指针遇到val时先走一步,慢指针不要动
    let slow = fast = 0
    // 
    while(fast < nums.length) {
   
        // 碰到val时,fast跳过它,作用是在下面的往前赋值过程中不移动它,让它被后面的值覆盖掉
        if(nums[fast] == val) fast++
        else {
   
            // 不是val,fast向slow移动数值
            // 移动数组
            nums[slow] = nums[fast]
            // 两个同时移动
            fast++
            slow++
        }
    }
    return slow
};
两个数组的交集 II

这是双指针在两个数组中的应用,分别指向两个数组。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值