【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 思路 & 代碼
- 鏈表模擬法
- 數學方法
- 二刷
題目描述
- 約瑟夫環!題目可太經典了
- 說實話還是有點難度的= =
思路 & 代碼
鏈表模擬法
- 第一想法是用 LinkedList,但是會超時,于是選擇ArrayList
- 關鍵在于 index = (index + m - 1) % n這個公式的推導,注意這個 -1 噢~
數學方法
- 倒推法,非常厲害,需要花時間理解。
- 甜姨的這篇題解寫得很好
- 主要思路:經過 n 輪后,只剩下最后一個答案,此時下標一定為0。那么往前推到經過 n - 1輪后,此時有兩個數字,如果能推出此時答案下標,那么就可以迭代地推到一開始(未去掉數字時)的答案下標,然后就得到答案了~
- 想推出上一輪下標,此時有什么信息:當前輪下標、當前輪數字個數、規定刪除計數。
- 根據這三個已知量,有公式 ans = (m + ans) % i。其實就是往前補 m 個,然后再取余即可。
二刷
- 模擬法
- 數學法:倒推, 先 + m 恢復到上一狀態,再用上一狀態長度 i 來進行數值修正
總結
以上是生活随笔為你收集整理的【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习笔记】第四章——文件 II(基本操
- 下一篇: java美元兑换,(Java实现) 美元