首页 > 代码库 > 45、圆圈中最后剩下的数字
45、圆圈中最后剩下的数字
思路1:环形链表,每次只删除一个数,都从第0个开始。每次都从链表重复遍历,每删除一个,走m步,共n遍
时间O(nm),空间o(n)
import java.util.*; public class Solution { public int LastRemaining_Solution(int n, int m) { if(n < 1 || m < 1) { return -1; } List<Integer> list = new LinkedList<>(); for (int i = 0; i < n; i++) { list.add(i); } int idx = 0; while(list.size() > 1) { // 只要移动m-1次就可以移动到下一个要删除的元素上 for (int i = 1; i < m; i++) { idx = (idx + 1) % list.size();//保证删除后,当数组数量小于m时,仍能正确的去删除 } list.remove(idx); } return list.get(0); } }
思路2:时间O(n),空间o(1),
f(n,m) = f ‘(n - 1, m) {删除一个数后,再每次去删除第m个,最后剩下的数 ,一定等于, 上一次操作中,再每次去删除第m个,最后剩下的数}
即,不管处于第几次删除第m个数的循环里,最后剩下的数是一样的。
f(n,m) = {0,n=1(f(n,m)表示在n个数中,每次删除第m个后,最后剩下的一个数)
[f(n -1,m) + m] % n, n > 1
public class Solution { public int LastRemaining_Solution(int n, int m) { if (n < 1 || m < 1) { return -1; } int last = 0; for (int i = 2; i <= n; i++) { last = (last + m) % i; } return last; } }
45、圆圈中最后剩下的数字
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。