剑指 Offer 62. 圆圈中最后剩下的数字

剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode)

总共n个数字,最后剩下一个数字,所以要进行n-1次删除。

用数组来模拟,进行倒推,假设活下来的人为 v:

  • 当只剩下 v 的时候,数组只有一个元素,v下标只能是0
  • 当剩下两个人(x和v,X不用管是谁,反正V在两个人里面)的时候,此时这两个人的下标有两种可能:x = 0, v = 1或者x = 1, v = 0,但是只有一种可能是v活下去的,这种可能中v的下标应该为:(0+m)%2。假设m = 3,那么v的下标必须为1才能活下去。

。。。还是看大佬的题解吧:Java解决约瑟夫环问题,告诉你为什么模拟会超时! - 圆圈中最后剩下的数字 - 力扣(LeetCode)

class Solution {
public:
    int lastRemaining(int n, int m) {
        int res = 0;//只剩下一个人的时候,下标必然为0
        // 最后一轮剩下2个人,所以从2开始反推
        for(int i = 2; i <= n; ++i){
            res = (res+m)%i;
        }
        return res;
    }
};

并不容易理解,还是建议自己画图看看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值