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

2020-06-28

1.题目描述

0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈
里剩下的最后一个数字。

2.题解

1.循环链表:超时
2.公式法:注意这里表示幸存在这一轮的的人的下标位置
class Solution {
    
    
public:
    struct LinkNode{
    
    
        LinkNode* next;
        int val;
    };

    int lastRemaining(int n, int m) {
    
    
        if (!n||!m) return -1;
        if (n==1) return 0;
        m=m%n;
        LinkNode* root=new LinkNode;
        root->val=0; // 头节点
        LinkNode* p=root;
        for (int i=1;i<n;i++){
    
    
            LinkNode* tmp=new LinkNode;
            tmp->val=i;
            p->next=tmp;
            p=tmp;
        }
        p->next=root; // 循环链表
        LinkNode* pre=p; // 用于连接
        p=root; // 从根节点开始
        for (int i=0;i<n-1;i++){
    
    
            for (int j=1;j<m;j++){
    
    
                pre=p;
                p=p->next;
            }
            pre->next=p->next;
            p=pre->next;
        }
        return p->val;
    }
};
class Solution {
    
    
public:
    

    int lastRemaining(int n, int m) {
    
    
        if (!n||!m) return -1;
        if (n==1) return 0;
       int res=0;
       for (int i=2;i<=n;i++){
    
    
           res=(res+m)%i;
       }
       return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34600424/article/details/107002558