日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表)

發布時間:2024/7/23 java 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 思路 & 代碼
      • 鏈表模擬法
      • 數學方法
      • 二刷

題目描述

  • 約瑟夫環!題目可太經典了
  • 說實話還是有點難度的= =

思路 & 代碼

鏈表模擬法

  • 第一想法是用 LinkedList,但是會超時,于是選擇ArrayList
  • 關鍵在于 index = (index + m - 1) % n這個公式的推導,注意這個 -1 噢~
class Solution {public int lastRemaining(int n, int m) {// 模擬鏈表法:LinkedList 會超時,用 ArrayListArrayList<Integer> list = new ArrayList<>();for(int i = 0; i < n; i++) {list.add(i);}int index = 0;while(n > 1){// -1: 進行刪除后前移index = (index + m - 1) % n;list.remove(index);n--;}// 剩下最后一個~return list.get(0);} }

數學方法

  • 倒推法,非常厲害,需要花時間理解。
  • 甜姨的這篇題解寫得很好
  • 主要思路:經過 n 輪后,只剩下最后一個答案,此時下標一定為0。那么往前推到經過 n - 1輪后,此時有兩個數字,如果能推出此時答案下標,那么就可以迭代地推到一開始(未去掉數字時)的答案下標,然后就得到答案了~
  • 想推出上一輪下標,此時有什么信息:當前輪下標、當前輪數字個數、規定刪除計數。
  • 根據這三個已知量,有公式 ans = (m + ans) % i。其實就是往前補 m 個,然后再取余即可。
class Solution {public int lastRemaining(int n, int m) {// 數學方法:倒推// 最后剩下一個數字,下標就是0int ans = 0;// 最后一輪剩下兩個人,從后往前for(int i = 2; i <= n; i++){// 推出“當前元素下標在上一輪中的下標”ans = (m + ans) % i;}// 結束后,元素下標 == 元素return ans;} }

二刷

  • 模擬法
class Solution {public int lastRemaining(int n, int m) {List<Integer> loop = new ArrayList<>();for(int i = 0; i < n; i++) {loop.add(i);}int index = 0;while(loop.size() > 1) {index = (index + m - 1) % loop.size();loop.remove(index);}return loop.get(0);} }
  • 數學法:倒推, 先 + m 恢復到上一狀態,再用上一狀態長度 i 來進行數值修正
class Solution {public int lastRemaining(int n, int m) {int ans = 0;for(int i = 2; i <= n; i++) {ans = (ans + m) % i;}return ans;} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】剑指 Offer 62. 圆圈中最后剩下的数字(Java、约瑟夫环、链表)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。