剑指 offer 62 圆圈中最后剩下的数字
环形链表
class Solution {
public int lastRemaining(int n, int m) {
if(m==1){
return n-1;
}
Node root = new Node(0);
Node p = root;
for (int i = 1; i < n; i++) {
Node node = new Node(i);
p.next = node;
p = p.next;
}
p.next = root;
p=root;
int i=1;
while (p.next!=p){
if (i==m-1){
// System.out.println(p.next.val);
p.next=p.next.next;
// p=p.next;
i=0;
}
p=p.next;
i++;
}
return p.val;
}
}
class Node{
int val;
Node next;
public Node(int val) {
this.val = val;
}
public Node() {
}
}
时间复杂度
O
(
m
n
)
O(mn)
O(mn),删除一个数字需要
m
m
m步,共有
n
n
n个数字。
空间复杂度
O
(
n
)
O(n)
O(n),需要一个辅助的环形链表。
动态规划
class Solution {
public int lastRemaining(int n, int m) {
int p = 0;
int q = 0;
for(int i=2;i<=n;i++){
p = q;
q = (p+m)%i;
}
return q;
}
}
class Solution {
public int lastRemaining(int n, int m) {
int p = 0;
for(int i=2;i<=n;i++){
p = (p+m)%i;
}
return p;
}
}
时间复杂度
O
(
n
)
O(n)
O(n)。
空间复杂度
O
(
1
)
O(1)
O(1)。