【DW組隊學習—LeetCode】day14
215. 陣列中的第K個最大元素
在未排序的陣列中找到第 k 個最大的元素。請注意,你需要找的是陣列排序後的第 k 個最大的元素,而不是第 k 個不同的元素。
【示例 1】輸入: [3,2,1,5,6,4] 和 k = 2 輸出: 5
【示例 2】輸入: [3,2,3,1,2,4,5,5,6] 和 k = 4 輸出: 4
說明:
你可以假設 k 總是有效的,且 1 ≤ k ≤ 陣列的長度。
嘗試思路:
1、排序
2、取倒數第k個數
程式碼:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
nums.sort()
return nums[-k]
屬於抄近道了,寫了氣泡排序,結果超時了
程式碼:
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
for i in range(len(nums)):
for j in range(len(nums) - i - 1):
if nums[j] > nums[ j + 1]:
a, b = nums[j], nums[j + 1]
nums[j], nums[j + 1] = b, a
return nums[-k]
217. 存在重複元素
給定一個整數陣列,判斷是否存在重複元素。
如果存在一值在陣列中出現至少兩次,函式返回 true 。如果陣列中每個元素都不相同,則返回 false 。
【示例 1】輸入: [1,2,3,1] 輸出: true
【示例 2】輸入: [1,2,3,4] 輸出: false
【示例 3】 輸入: [1,1,1,3,3,4,3,2,4,2] 輸出: true
嘗試思路1:
迴圈判斷當前元素是否在後面出現,若有則直接返回true,否則全部判斷完返回false
程式碼:
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
for i in range(len(nums)):
if nums[i] in nums[i + 1:]:
return True
return False
【錯誤】超時
嘗試思路2:
排序後判斷是否與下一個元素相同
程式碼:
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
nums.sort()
for i in range(len(nums) - 1):
if nums[i] == nums[i + 1]:
return True
return False
230. 二叉搜尋樹中第K小的元素
給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。
說明: 你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。
【示例 1】輸入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
輸出: 1
【示例 2】輸入: root = [5,3,6,2,4,null,null,1], k = 3
5
/
3 6
/ \
2 4
/
1
輸出: 3
進階: 如果二叉搜尋樹經常被修改(插入/刪除操作)並且你需要頻繁地查詢第 k 小的值,你將如何優化 kthSmallest 函式?
嘗試思路:遞迴
程式碼:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def kthSmallest(self, root: TreeNode, k: int) -> int:
self.l = []
def getl(node):
if node:
self.l.append(node.val)
getl(node.left)
getl(node.right)
getl(root)
self.l.sort()
return self.l[k - 1]