JZ46 圆圈中最后剩下的数字***
题目描述
0,1,...这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里最后一个数字。
思路
这道题就是有名的约瑟夫环问题,有两种解题方法
(1)环形链表模拟圆圈
(2) 分析每次被删除的数字的规律并直接计算出圆圈中最后剩下的数字
方法1:环形链表模拟圆圈
构造一个循环链表,每次在这个链表中删除第m个节点
注意:牛客里好像已经定义了节点,如果没有的话需要自己进行定义
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<=0||m<=0)
return -1;
//构造循环链表
ListNode* head=new ListNode(0); //头结点
ListNode* pre=head;
ListNode* temp=NULL;
for(int i=1;i<n;i++)
{
temp = new ListNode(i);
pre->next=temp;
pre=temp;
}
pre->next=head;//将第n-1个节点指向头结点
temp=head;//开始从头进行删除操作
while(n!=1)
{
for(int i=0;i<m-2;i++)//注意这里什么时候停下来进行删除操作
temp=temp->next;
temp->next=temp->next->next;//删除temp后面的节点
head=temp->next;
temp=head;
n--;
}
return temp->val;
}
};