Leetcode 390. 消除遊戲 遞迴
題目:
給定一個從1 到 n 排序的整數列表。
首先,從左到右,從第一個數字開始,每隔一個數字進行刪除,直到列表的末尾。
第二步,在剩下的數字中,從右到左,從倒數第一個數字開始,每隔一個數字進行刪除,直到列表開頭。
我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下一個數字。
返回長度為 n 的列表中,最後剩下的數字。
示例:
輸入: n = 9, 1 2 3 4 5 6 7 8 9 2 4 6 8 2 6 6 輸出: 6
思路:
1,2,3,4,5,6,7,8,9第一次刪除之後的序列為2,4,6,8,我們發現其為2*(1,2,3,4),通俗一點的即為2*(1,2,3,...,n/2);下一步執行的是從後面進行刪除,我們可以將其倒置,從前面進行刪除,然後減去用數目n+1減去那個數即可。
說白了這個題就是將兩次操作想辦法歸併成一中操作然後用遞迴的方式計算出答案。
程式碼如下:
class Solution {
public:
int lastRemaining(int n) {
return n==1? 1:2*(n/2+1-lastRemaining(n/2));
}
};
相關推薦
Leetcode 390. 消除遊戲 遞迴
題目: 給定一個從1 到 n 排序的整數列表。 首先,從左到右,從第一個數字開始,每隔一個數字進行刪除,直到列表的末尾。 第二步,在剩下的數字中,從右到左,從倒數第一個數字開始,每隔一個數字進行刪除,直到列表開頭。 我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下一個數字。
LeetCode : 390. 消除遊戲(Elimination Game)分析和解答
390. 消除遊戲 給定一個從1 到 n 排序的整數列表。 首先,從左到右,從第一個數字開始,每隔一個數字進行刪除,直到列表的末尾。 第二步,在剩下的數字中,從右到左,從倒數第一個數字開始,每隔一個數字進行刪除,直到列表開頭。 我們不斷重複這兩步,從左到右和從右
390.消除遊戲
給定一個從1 到 n 排序的整數列表。 首先,從左到右,從第一個數字開始,每隔一個數字進行刪除,直到列表的末尾。 第二步,在剩下的數字中,從右到左,從倒數第一個數字開始,每隔一個數字進行刪除,直到列表開頭。 我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下一個數字。 返回長度為 n 的列表
Leetcode---島嶼的個數--遞迴
島嶼的個數 題目連結:島嶼的個數 思路: 本題就是簡單的連通圖個數問題 只需要找出所有連通圖的個數,當一個點為:1時,只需遞迴擴散到周圍四個點,再額外定義一個visit陣列記錄遍歷過的節點 當一個連通圖遍歷完全時,再繼續尋找下一個連通圖,進行計數 程
[leetcode] 51. N-Queens (遞迴)
遞迴,經典的八皇后問題。 利用一位陣列儲存棋盤狀態,索引表示行,值為-1表示空,否則表示列數。 對行進行搜尋,對每一行的不同列數進行判斷,如果可以擺放符合規則,則擺放,同時遍歷下一行。 遍歷過程中,若已經遍歷了n行,則儲存該狀態。 Runtime: 4 ms, faster than 91.
[leetcode]爬樓梯的遞迴和非遞迴方法
【Description】 You are climbing a stair case. It takes n steps to reach to the top. Each time you
消除左遞迴和LL(1)文法造表
消除左遞迴和LL(1)文法造表 1.消除左遞迴 1.1定義 有A->Aa形式的產生式的文法為直接左遞迴文法。 類似,若是多步推導得到A->Aa形式的產生式的文法為間接左遞迴文法。 1.2直接左遞迴消除($表示空串) 原產生式: A->Aa|b
LeetCode刷題總結-遞迴篇
遞迴是演算法學習中很基本也很常用的一種方法,但是對於初學者來說比較難以理解(PS:難點在於不斷呼叫自身,產生多個返回值,理不清其返回值的具體順序,以及最終的返回值到底是哪一個?)。因此,本文將選擇LeetCode中一些比較經典的習題,通過簡單測試例項,具體
LeetCode 78 90 子集 子集II (回溯,遞迴)
1.子集 難度:中等 給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。 說明:解集不能包含重複的子集。 示例: 輸入: nums = [1,2,3] 輸出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []
LeetCode 257 113 437 二叉樹的所有路徑 路徑之和II 路徑之和III(二叉樹,遞迴)
1.二叉樹的所有路徑 給定一個二叉樹,返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 1 / \ 2 3 \ 5 輸出: [“1->2->5”, “1->3”] 解釋: 所有根節點到葉子節點
Leetcode 96 95 不同的二叉搜尋樹(動態規劃、搜尋樹) 不同的二叉搜尋樹II (遞迴、搜尋樹)
1.不同的二叉搜尋樹 給定一個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種? 示例: 輸入: 3 輸出: 5 解釋: 給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹: 1 3 3 2 1 \
leetcode 70. 爬樓梯【遞迴】【Easy】&& 劍指Offer面試題10 題目2:青蛙跳臺階問題
題目: 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1. 1
LeetCode 926. 將字串翻轉到單調遞增 遞迴實現動態規劃 兩種解法
這個題做了一個多小時,考慮複雜了。 開始推動規沒有推出來,然後找到一個遞推關係:從左往右,如果是0,則不需要變動;如果是1,則有兩種選擇(1)將1變為0(2)將1後面的所有數字變為1,這兩種方法中的變動數字最小的方法就是最佳方法,然後依次遞推,很容易寫出遞迴程式。但是這裡面存
【LeetCode】 70. 爬樓梯--簡單遞迴的應用
簡單遞迴 C++ 通過找規律發現後面數字等於前面兩項之和 於是通過簡單遞迴寫出程式如下 #include <iostream> using namespace std; int ds(int n){ if(n==0) return 0; else if (n=
206. 反轉連結串列 [Leetcode] 206. 反轉連結串列 java 迭代和遞迴
一、迭代(https://blog.csdn.net/fx677588/article/details/72357389 ) class Solution { public ListNode reverseList(ListNode head) {
leetcode 783. 二叉搜尋樹結點最小距離(遞迴和非遞迴實現java)
題目描述: 給定一個二叉搜尋樹的根結點 root, 返回樹中任意兩節點的差的最小值。 示例: 輸入: root = [4,2,6,1,3,null,null] 輸出: 1 解釋: 注意,root是樹結點物件(TreeNode object),而不是陣列。 給定的樹 [4,
洛谷P1057傳球遊戲(逆向遞推遞迴+記憶化)
題目連結:https://www.luogu.org/problemnew/show/P1057 剛看到這道題,就是正向暴力遞迴暴力出所有情況,而且資料範圍這麼小,就寫了暴力遞迴,但是。。。tle好幾個點。。。 仔細跟著程式走了一遍樣例,發現暴力遞迴過程中好多點都重複計算,重複暴力了,So
LeetCode—77. Combinations_遞迴暴力搜尋_dfs_深度優先
題目是這樣的: 首先說明這是一個經典的遞迴窮舉搜尋問題——dfs(深度優先搜尋)題目給定N在從1...........n中存在K個數組能夠排列,就是從n中選擇k個數字進行排列。 首先老套路定義一個全域性變數來接受所得的答案,然後在函式中定義一個path(所有的路徑方案),然後就是從第一
Leetcode之合併有序單鏈表(簡單 連結串列 遞迴)
合併兩個已排序的連結列表並將其作為新列表返回。新列表應該通過拼接前兩個列表的節點來完成。 例: 輸入: 1-> 2-> 4,1-> 3-> 4 輸出: 1-> 1-> 2-> 3-> 4-> 4 直接遞迴實現,程式碼來了 /**
Leetcode 437 路徑總和 III(遞迴)(未解決)
給定一個二叉樹,它的每個結點都存放著一個整數值。 找出路徑和等於給定數值的路徑總數。 路徑不需要從根節點開始,也不需要在葉子節點結束,但是路徑方向必須是向下的(只能從父節點到子節點)。 二叉樹不超過1000個節點,且節點數值範圍是 [-1000000,1000000] 的整數。 示例