第一題 兩數之和
給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:
輸入:nums = [3,3], target = 6
輸出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只會存在一個有效答案
題解:
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i in range(len(nums)):if i != (len(nums) - 1):for j in range(i + 1, len(nums)):if nums[i] + nums[j] == target:return [i, j]return []
進階:
你可以想出一個時間復雜度小于 O(n2) 的算法嗎?
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:dic = {}for idx, num in enumerate(nums):res = target - numif res in dic:return [dic[res], idx]dic[num] = idx
第二題 字母異位詞分組
給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。
示例 1:
輸入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
輸出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
解釋:
在 strs 中沒有字符串可以通過重新排列來形成 “bat”。
字符串 “nat” 和 “tan” 是字母異位詞,因為它們可以重新排列以形成彼此。
字符串 “ate” ,“eat” 和 “tea” 是字母異位詞,因為它們可以重新排列以形成彼此。
示例 2:
輸入: strs = [“”]
輸出: [[“”]]
示例 3:
輸入: strs = [“a”]
輸出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 僅包含小寫字母
題解:
class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:dic = defaultdict(list)for s in strs:s_sort = ''.join(sorted(s))dic[s_sort].append(s)return list(dic.values())
第三題 最長連續序列
給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。
請你設計并實現時間復雜度為 O(n) 的算法解決此問題。
示例 1:
輸入:nums = [100,4,200,1,3,2]
輸出:4
解釋:最長數字連續序列是 [1, 2, 3, 4]。它的長度為 4。
示例 2:
輸入:nums = [0,3,7,2,5,8,4,6,0,1]
輸出:9
示例 3:
輸入:nums = [1,0,1,2]
輸出:3
提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
題解:
class Solution:def longestConsecutive(self, nums: List[int]) -> int:nums_set = set(nums)res = 0for i in nums_set:if i - 1 in nums_set:continuej = i + 1while j in nums_set:j += 1res = max(res, j - i)return res
第四題 移動零
給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
請注意 ,必須在不復制數組的情況下原地對數組進行操作。
示例 1:
輸入: nums = [0,1,0,3,12]
輸出: [1,3,12,0,0]
示例 2:
輸入: nums = [0]
輸出: [0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
題解:
class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""c = 0for i in range(len(nums)):if nums[i] == 0:c += 1else:nums[i - c] = nums[i]for i in range(len(nums) - c, len(nums)):nums[i] = 0
第五題 盛最多的水
給定一個長度為 n 的整數數組 height 。有 n 條垂線,第 i 條線的兩個端點是 (i, 0) 和 (i, height[i]) 。
找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
返回容器可以儲存的最大水量。
說明:你不能傾斜容器。
示例 1:
輸入:[1,8,6,2,5,4,8,3,7]
輸出:49
解釋:圖中垂直線代表輸入數組 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。
示例 2:
輸入:height = [1,1]
輸出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
題解:
class Solution:def maxArea(self, height: List[int]) -> int:i, j = 0, len(height) - 1s = 0while i <= j:if height[i] < height[j]:min_h = height[i]i += 1else:min_h = height[j]j -= 1s = max(s, min_h * (j - i + 1))return s