劍指 Offer 62. 圓圈中最後剩下的數字(約瑟夫環問題)

題目:

劍指 Offer 62. 圓圈中最後剩下的數字
在這裏插入圖片描述

題解:約瑟夫環問題

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

1. 題解一:模擬鏈表,O(n²)

在這裏插入圖片描述
在這裏插入圖片描述

2. 題解二:數學解法,O(n)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

代碼:

1. 代碼一:模擬鏈表,O(n²)

import java.util.*;

public class 面試題62 {

    // 方法1:模擬鏈表
    public static int lastRemaining(int n, int m) {
        ArrayList<Integer> list = new ArrayList<>();
        for(int i = 0; i < n; i++)
        {
            list.add(i);
        }
        int index = 0;
        while(n > 1)
        {
            index = (index + m - 1) % n;
            list.remove(index);
            n--;
        }
        return list.get(0);
    }

    public static void main(String[] args) {
        int n1 = 5, m1 = 3;
        int res1 = lastRemaining(n1, m1);
        System.out.println(res1); // 3

        int n2 = 10, m2 = 17;
        int res2 = lastRemaining(n2, m2);
        System.out.println(res2); // 2
    }
}

2. 代碼二:數學解法,O(n)

import java.util.*;

public class 面試題62 {

    // 方法2:數學解法
    public static int lastRemaining(int n, int m) {
        int ans = 0;
        // 最後一輪剩下2個人,所以從2開始反推
        for(int i = 2; i <= n; i++)
        {
            ans = (ans + m) % i;
        }
        return ans;
    }

    public static void main(String[] args) {
        int n1 = 5, m1 = 3;
        int res1 = lastRemaining(n1, m1);
        System.out.println(res1); // 3

        int n2 = 10, m2 = 17;
        int res2 = lastRemaining(n2, m2);
        System.out.println(res2); // 2
    }
}

參考:

  1. Java解決約瑟夫環問題,告訴你爲什麼模擬會超時!
  2. 圓圈中最後剩下的數字
  3. 換個角度舉例解決約瑟夫環
  4. 圖解約瑟夫環,還送《具體數學》PDF 🐳喫鯨 Σ(っ °Д °;)っ
  5. c++ 倒推法 【面試題62. 圓圈中最後剩下的數字】
  6. 四種方法,詳細解答
  7. python,全真模擬,真·暴力解
  8. 解釋遞推公式,遞歸迭代隨便寫
  9. 理解規律,很簡單!JavaScript解法
  10. 約瑟夫環問題圖解,多種寫法詳細思路分析
  11. 這或許是你能找到的最詳細約瑟夫環數學推導!
  12. 約瑟夫環——公式法(遞推公式)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章