Skip to content

Latest commit

 

History

History
43 lines (35 loc) · 826 Bytes

62. 圆圈中最后剩下的数字.md

File metadata and controls

43 lines (35 loc) · 826 Bytes

解题思路

1. 模拟(超时)

按照题目方法借助数组模拟过程

func lastRemaining(n int, m int) int {
    // 初始化队列
    q := make([]int, 0)
    for i := 0; i < n; i++ {
        q = append(q, i)
    }
    idx := 0
    for len(q) != 1 {
        // 选择删除的位置
        idx = (idx+m-1)%len(q)
        // 从队列中踢出去
        q = append(q[:idx], q[idx+1:]...)
    }
    return q[0]
}

2. 反推回去

找规律反向推出数字每次删的位置 每次删除时,补上 m 个位置,再模上当时的数组长度大小 i (当前 index + m) % 上一轮剩余数字的个数

func lastRemaining(n int, m int) int {
    ans := 0
    for i := 2; i <= n; i++ {
        ans = (ans + m)%i
    }
    return ans
}