多指针的应用

一.快慢指针基本

1.基本样式

基本格式

fast=getNext(n);
slow=n;
while(fast!=slow){
    slow=getNext(slow);
    fast=getNext(getNext(fast);
}

二.快慢指针的应用 

 1.利用快慢指针检测环

   例题1--202. 快乐数,编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

  • 若循环,必定存在环
    int getNum(int n){
        int ans=0;
        while(n>0){
            ans+=(n%10)*(n%10);
            n=n/10;
        }
        return ans;
    }
    bool isHappy(int n) {
        int fastNum=getNum(n);
        int slowNum=n;
        while(fastNum!=1&&fastNum!=slowNum){
            fastNum=getNum(getNum(fastNum));
            slowNum=getNum(slowNum);
        }
        return fastNum==1;
    }

  例题2--287. 寻找重复数,给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

  • 抽屉原理:把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。
  • 以当前数组元素的值,为下一个数组元素的下标,构建链表
    int findDuplicate(vector<int>& nums) {
        int slow=0,fast=0;
        do{
            slow=nums[slow];
            fast=nums[nums[fast]];
        }while(slow!=fast);
        slow=0;
        while(slow!=fast){
            slow=nums[slow];
            fast=nums[fast];
        }
        return slow;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值