本文共 1043 字,大约阅读时间需要 3 分钟。
题目描述:给定一个整数集合S,起始为1到n的连续整数。每次从集合中移除一个元素,并将其乘以k。最终剩下的唯一一个元素即为“赢家”。任务是通过编写代码,找出这个赢家。
#includeusing namespace std;class Solution {public: int findTheWinner(int n, int k) { vector dp; for(int i = 1; i <= n; ++i) { dp.push_back(i); } auto pos = dp.begin(); while(dp.size() > 1) { int count = 1; while(count != k) { pos++; count++; if(pos == dp.end()) { pos = dp.begin(); } } pos = dp.erase(pos); if(pos == dp.end()) { pos = dp.begin(); } } return dp.front(); }};
该代码通过模拟一个循环过程来找出最终的赢家。具体步骤如下:
dp来存储当前集合的元素,初始值为1到n的连续整数。count为1,表示已经处理了多少次。count个元素的位置。pos指向集合末尾时,循环将其重置到集合起始位置。该算法的时间复杂度为O(n^2),在n较小时能够较好地运行。通过不断地移除元素并更新当前位置,逐步缩小集合范围,最终找到最后一个剩下的元素。
转载地址:http://vbni.baihongyu.com/