天天看點

劍指offer | 面試題49:圓圈中最後剩下的數字

劍指offer | 面試題49:圓圈中最後剩下的數字

死磕算法系列文章

  1. 幹貨 | 手撕十大經典排序算法
  2. 劍指offer | 認識面試
  3. 劍指offer | 面試題2:實作Singleton模式
  4. 劍指offer | 面試題3:二維數組的查找
  5. 劍指offer | 面試題4:替換空格
  6. 劍指offer | 面試題5:從尾到頭列印連結清單
  7. 劍指offer | 面試題6:重建二叉樹
  8. 劍指offer | 面試題7:用兩個棧實作隊列
  9. 劍指offer | 面試題8:旋轉數組的最小數字
  10. 劍指offer | 面試題9:斐波那契數列
  11. 劍指offer | 面試題10:青蛙跳台階問題
  12. 劍指offer | 面試題11:矩陣覆寫
  13. 劍指offer | 面試題12:二進制中1的個數
  14. 劍指offer | 面試題13:數值的整數次方
  15. 劍指offer | 面試題14:列印從1到最大的n位數
  16. 劍指offer | 面試題15:删除連結清單的節點
  17. 劍指offer | 面試題16:将數組中的奇數放在偶數前
  18. 劍指offer | 面試題17:連結清單中倒數第k個節點
  19. 劍指offer | 面試題18:反轉連結清單
  20. 劍指offer | 面試題19:合并兩個有序連結清單
  21. 劍指offer | 面試題20:判斷二叉樹A中是否包含子樹B
  22. 劍指offer | 面試題21:二叉樹的鏡像
  23. 劍指offer | 面試題22:順時針列印矩陣
  24. 劍指offer | 面試題23:包含min函數的棧
  25. 劍指offer | 面試題24:棧的壓入、彈出序列
  26. 劍指offer | 面試題25:從上到下列印二叉樹
  27. 劍指offer | 面試題26:二叉搜尋樹的後序周遊序列
  28. 劍指offer | 面試題27:二叉樹中和為某一值的路徑
  29. 劍指offer | 面試題28:複雜連結清單的複制
  30. 劍指offer | 面試題29:二叉搜尋樹轉換為雙向連結清單
  31. 劍指offer | 面試題30:字元串的排列
  32. 劍指offer | 面試題31:數組中出現次數超過一半的數字
  33. 劍指offer | 面試題32:最小的k個數
  34. 劍指offer | 面試題33:連續子數組的最大和
  35. 劍指offer | 面試題34:1~n 整數中 1 出現的次數
  36. 劍指offer | 面試題35:把數組排成最小的數
  37. 劍指offer | 面試題36:醜數
  38. 劍指offer | 面試題37:第一個隻出現一次的字元
  39. 劍指offer | 面試題38:數組中的逆序對
  40. 劍指offer | 面試題39:兩個連結清單的第一個公共節點
  41. 劍指offer | 面試題40:數組中數字出現的次數
  42. 劍指offer | 面試題41:二叉樹的深度
  43. 劍指offer | 面試題42:平衡二叉樹
  44. 劍指offer | 面試題43:和為s的兩個數字
  45. 劍指offer | 面試題44:和為s的連續整數序列
  46. 劍指offer | 面試題45:翻轉單詞順序
  47. 劍指offer | 面試題46:左旋轉字元串
  48. 劍指offer | 面試題47:n個骰子的點數
  49. 劍指offer | 面試題48:撲克牌中的順子

“Leetcode : https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof

“GitHub : https://github.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_49_lastRemaining/Solution.java

劍指 Offer 62. 圓圈中最後剩下的數字

“題目描述 :0,1,···,n-1這n個數字排成一個圓圈,從數字0開始,每次從這個圓圈裡删除第m個數字(删除後從下一個數字開始計數)。求出這個圓圈裡剩下的最後一個數字。

例如,0、1、2、3、4這5個數字組成一個圓圈,從數字0開始每次删除第3個數字,則删除的前4個數字依次是2、0、4、1,是以最後剩下的數字是3。

難度:簡單

示例 1:

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

複制

示例 2:

輸入: n = 10, m = 17
輸出: 
           

複制

利用公式法:f[n] = (f[n-1] + k) mod n,或使用循環連結清單實作

“來吧,一圖勝千言。如下圖所示,為 n = 5 , m = 3 時的狀态轉移和對應的模拟删除過程。
劍指offer | 面試題49:圓圈中最後剩下的數字
複雜度分析:
  • 時間複雜度 O(n): 狀态轉移循環 n - 1 次使用 O(n) 時間,狀态轉移方程計算使用 O(1) 時間;
  • 空間複雜度 O(1) : 使用常數大小的額外空間;
package com.nateshao.sword_offer.topic_49_lastRemaining;

/**
 * @date Created by 邵桐傑 on 2022/2/24 21:51
 * @微信公衆号 千羽的程式設計時光
 * @個人網站 www.nateshao.cn
 * @部落格 https://nateshao.gitee.io
 * @GitHub https://github.com/nateshao
 * @Gitee https://gitee.com/nateshao
 * Description:
 */
public class Solution {
    public static void main(String[] args) {
        int i = lastRemaining(5, 3);
        System.out.println("i = " + i);
    }
    public static int lastRemaining(int n, int m) {
        int x = 0;
        for (int i = 2; i <= n; i++) {
            // i 個人時删除數的索引等于 i-1 個人時删除數的索引+k(再對i 取餘)
            x = (x + m) % i;
        }
        return x;
    }
}
           

複制

參考文章:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/jian-zhi-offer-62-yuan-quan-zhong-zui-ho-dcow