Leetcode 分治演算法

2021-10-05 03:38:44 字數 2211 閱讀 9399

題目描述:

在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。

示例 1:

輸入: [3,2,1,5,6,4] 和 k = 2

輸出: 5

解法①:堆

思路:建立乙個大頂堆,並保持堆的大小小於等於k。堆內的排序從堆頂遞增,最後的堆頂就是所求。

時間複雜度:o(n logk):n 對n個陣列插入 logk:堆的插入是二分查詢

空間複雜度:o(k);

解法②:快速選擇

我的思路:尋找第k大,則是找第length-k小。並不需要把陣列排序,因為我們對於第k大左側順序,第k大右側順序不敢興趣。只要找到乙個數,它的左側有length-k-1比它小;它的右側有k-1個比它大即可

題解思路:

隨機選擇乙個樞軸;使用劃分演算法將樞軸放在陣列中的合適位置pos。將小於數週的元素移到左邊,大於等於樞軸移到右邊;比較pos和n-k,以決定在那邊繼續遞迴處理。

**:

public

class

solution

intquickselect

(int left,

int right,

int target,

refint

nums)

//遞迴運算

intpartition

(int left,

int right,

int target,

refint

nums)

//進行排序

//假如都是小於,則left會一直等於i;等到有大於的,left會一直指向大於的數,直到拍到後面

swap

(right,left,

ref nums)

;//最後把樞軸給換到中間的地方

return left;

//樞軸的序號

}void

swap

(int i,

int j,

refint

nums)

//進行對調

}

最快的方法:

public

class

solution

private

intquickselect

(int left,

int right,

int kthsmallest)

private

intpartition

(int left,

int right,

int pivotindex)

}swap

(pivotindex, right)

;return pivotindex;

}private

void

swap

(int left,

int right)

}不同之處:它把nums提到了class內,這樣就不用一直傳遞nums,在return**,它直接用了else,不用再加個return

0

題目描述:

給定m×n矩陣,每一行、每一列都按公升序排列,請編寫**找出某元素。

示例:現有矩陣 matrix 如下:

[[1, 4, 7, 11, 15],

[2, 5, 8, 12, 19],

[3, 6, 9, 16, 22],

[10, 13, 14, 17, 24],

[18, 21, 23, 26, 30]

]給定 target = 5,返回 true。

給定 target = 20,返回 false。

題目描述:

我們有乙個由平面上的點組成的列表 points。需要從中找出 k 個距離原點 (0, 0) 最近的點。

(這裡,平面上兩點之間的距離是歐幾里德距離。)

你可以按任何順序返回答案。除了點座標的順序之外,答案確保是唯一的。

示例 1:

輸入:points = [[1,3],[-2,2]], k = 1

輸出:[[-2,2]]

解釋:(1, 3) 和原點之間的距離為 sqrt(10),

(-2, 2) 和原點之間的距離為 sqrt(8),

由於 sqrt(8) < sqrt(10),(-2, 2) 離原點更近。

我們只需要距離原點最近的 k = 1 個點,所以答案就是 [[-2,2]]

LeetCode學習 分治演算法思想

之前我們說了遞迴的重點就是乙個終止條件 也叫邊界條件 此處的邊界條件就是f n 中的n 1 當n 1時就表示遞迴進入了最低成,下一步就是要往上返回了。算 n 的階乘 假設n不為0 deff n if n 1 return 1else return n f n 1 print f 6 720再來說這段...

演算法 分治演算法

分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...

演算法 分治演算法

leetcode 169.多數元素 應用舉例 通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中 卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。相關概念 一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序...