剑指 Offer 62—— 圆圈中最后剩下的数字

题目连接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/

0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

输入: n = 5, m = 3
输出: 3

输入: n = 10, m = 17
输出: 2

解题过程:

数组下标取余:

每次取余的摸是列表的大小

class Solution {
    public int lastRemaining(int n, int m) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        int currentIndex = 0;
        while (n > 1) {
            currentIndex =  (currentIndex + m - 1) % n;   // 找到要删除的元素位置
            list.remove(currentIndex);
            n--;
        }
        return list.get(0);
    }
}

另一种思路(官方题解)

class Solution {
    public int lastRemaining(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;
    }
}

你可能感兴趣的:(LeetCode)