領扣網演算法學習筆記 215

2021-09-02 15:33:37 字數 2331 閱讀 7668

本系列的演算法題目來自領扣網

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

示例:

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

輸出: 5

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

輸出: 4

說明:

你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。

思路一:

看到這題的第乙個思路是:採用快速排序,排序後在取第k個元素。

**如下:

class

solution

public

static

void

questsort

(int

nums,

int _left,

int _right)

int temp = nums[left]

;while

(left < right)

nums[left]

= nums[right];if

(left < right && nums[left]

>= temp)

nums[right]

= nums[left];}

nums[right]

= temp;

questsort

(nums,_left,left-1)

;questsort

(nums,right+

1,_right);}

}// 用時153ms

後續思考:

​ 感覺這個效率好低,然後寫完之後看了一下最佳答案,發現其實不用排序,只要採用快排的思路即可。

思路二:

​ 快排可以使元素分成兩部分,在這裡前面部分是大於指定資料的,後面部分是小於指定資料的,這樣的話,只需要使得前面大於它的數有k個就好了。

**如下:

class

solution

else

if(k < loopvalue)

else

loopvalue =

questsortnum

(nums,left,right);}

}public

static

intquestsortnum

(int

nums,

int left,

int right)

int temp = nums[left]

;while

(left < right)

nums[left]

= nums[right];if

(left < right && nums[left]

>= temp)

nums[right]

= nums[left];}

nums[right]

= temp;

return left;}}

// 第一次用時54ms,第二次用時63ms,神奇,形同**,速度不一樣......

後續思考:

​ 之前一直想著,利用快速排序的方法,先快排一遍,判斷當前排序後的參考值的位置,然後在使其中一邊等於參考值的位置,導致這個死活的迴圈不出來,後面想通了,如果迴圈到後面,兩個數相等,這個左右的位置就不會再變動,就會一直死迴圈在這個,這樣會有問題,然後就拋棄當前參考值的位置,反正判斷都不是那個位置。

領扣上面該題其他高質量範例:

class

solution

else

}return nums[k];}

intqsort

(int

nums,

int left,

int right)

}while

(i <= j);if

(j < left)

return left;

//防止j越界,陷入無限迴圈

return j;}}

// 用時2ms

後續思考:

​ 第一眼看到這個程式時,總覺得判斷後直接 i++ 或者 j-- ,在某種特定的情況下會產生資料越界,測試後發現,無論什麼情況,都會有一種情況出現,就是數的本身不會小於或者大於它自己,所以不會再這裡不會造成資料越界,同時又需要返回值,不管是left,還是right,最後遍歷都有可能到資料的最右端或者最左端,所以需要判斷返回值是否越界。

​ 至於為什麼比我上面那個速度要快,還沒想清楚在哪,後續在思考思考,想通了再補上、。

領扣網演算法學習筆記 283

本系列的演算法題目來自領扣網 給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。示例 輸入 0,1,0,3,12 輸出 1,3,12,0,0 說明 必須在原陣列上操作,不能拷貝額外的陣列。儘量減少操作次數。思路一 看到這題的第乙個思路是 檢測到0後,將陣列後面的...

領扣網演算法學習筆記 167

本系列的演算法題目來自領扣網 給定乙個已按照 公升序排列 的有序陣列,找到兩個數使得它們相加之和等於目標數。函式應該返回這兩個下標值 index1 和 index2,其中 index1 必須小於 index2。示例 輸入 numbers 2,7,11,15 target 9 輸出 1,2 解釋 2 ...

演算法 學習筆記

1.輸入輸出演算法至少有乙個或多個輸出 2.有窮性 3.確定性 4.可行性 1.正確性a.演算法程式沒有語法錯誤 b.演算法程式對於合法的輸入資料能夠產生滿足要求的輸出結果 c.演算法程式對於非法的輸入資料能夠得出滿足規格說明的結果 d.演算法對於精心選擇的,甚至刁難的測試資料都有滿足要求的輸出結果...