首頁>技術>

題目

給定一個從1 到 n 排序的整數列表。

我們不斷重複這兩步,從左到右和從右到左交替進行,直到只剩下一個數字。

返回長度為 n 的列表中,最後剩下的數字。

示例:輸入:

n = 9,

1 2 3 4 5 6 7 8 9

2 4 6 8

2 6

6

輸出:6

解題思路分析

1、遞迴;時間複雜度O(log(n)),空間複雜度O(log(n))

func lastRemaining(n int) int {	if n == 1 {		return 1	}	// f(2k)/f(2k+1) = 2(k+1-f(k)),最後奇數2k+1不影響結果	return 2 * (n/2 + 1 - lastRemaining(n/2))}

2、遞迴;時間複雜度O(log(n)),空間複雜度O(log(n))

func lastRemaining(n int) int {	return dfs(n, 1)}func dfs(n int, isLeftToRight int) int {	if n == 1 {		return 1	}	if n%2 == 1 { // 奇數		return 2 * dfs(n/2, 1-isLeftToRight)	}	if isLeftToRight == 1 { // 偶數從左往右		return 2 * dfs(n/2, 1-isLeftToRight)	}	// 偶數從右往左,如1,2,3,4,5,6,7,8 => 1,3,5,7	return 2*dfs(n/2, 1-isLeftToRight) - 1}
總結

Medium題目,暴力法容易超時,分析找到規律即可

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 隨機打亂陣列Fisher–Yates shuffle演算法詳解