目录
刷题日期:下午8:42 2021年5月26日星期三
个人刷题记录,代码收集,来源皆为leetcode
经过多方讨论和请教,现在打算往Java方向发力
主要答题语言为Java
题目:
剑指 Offer 62. 圆圈中最后剩下的数字
难度简单369
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
示例 1:
输入: n = 5, m = 3
输出: 3
示例 2:
输入: n = 10, m = 17
输出: 2
限制:
1 <= n <= 10^5
1 <= m <= 10^6
题目分析
如果能用循环链表一类的存放肯定就简单多了,直接遍历到剩唯一一个即可。
肯定不能直接用数组来弄,因为数组的特点就是查找简单但是插入删除麻烦,而且数组长度在100000,稍微长一点就会超时。
单纯的存在链表也不好用,同样因为长度太长,占用空间会很大。
最好就是找到某个数学公式,直接计算出来何时能把n轮完,计算得到下标直接返回即可。
初始解答:
举例子尝试了下,规律还是不太好找,而且感觉可能还是一道动态规划的题。
看了K神的分析,果然逃不过动态规划,但是分析完也太简单了吧,果然还是自己太菜。
class Solution {
public int lastRemaining(int n, int m) {
int x = 0;
// 不论如何最后一轮剩下2个,所以从2开始
for(int i = 2; i <= n; i++) {
x = (x + m) % i;
}