454.四數相加II
建議:本題是 使用map 巧妙解決的問題,好好體會一下 雜湊法 如何提高程式執行效率,降低時間複雜度,當然使用雜湊法 會提高空間複雜度,但一般來說我們都是舍空間 換時間, 工業開發也是這樣。
題目連結/文章講解/影片講解:https://programmercarl.com/0454.四數相加II.html
思考
4個獨立的陣列,可以用雜湊解決。
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
sum_dic = {}
for i in nums1:
for j in nums2:
if i+j not in sum_dic:
sum_dic[i+j]=1
else:
sum_dic[i+j]+=1
res = 0
for i in nums3:
for j in nums4:
if -(i+j) in sum_dic:
res+=sum_dic[-i-j]
return res
383. 贖金信
建議:本題 和 242.有效的字母異位詞 是一個思路 ,算是擴充題
題目連結/文章講解:https://programmercarl.com/0383.贖金信.html
思考
很簡單的一道題
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
char_map = [0] * 26
for c in magazine:
char_map[ord(c)-ord('a')]+=1
for c in ransomNote:
if char_map[ord(c)-ord('a')] <= 0:
return False
char_map[ord(c)-ord('a')]-=1
return True
15. 三數之和
建議:本題雖然和 兩數之和 很像,也能用雜湊法,但用雜湊法會很麻煩,雙指標法才是正解,可以先看影片理解一下 雙指標法的思路,文章中講解的,沒問題 雜湊法很麻煩。
題目連結/文章講解/影片講解:https://programmercarl.com/0015.三數之和.html
思考
雙指標的題目,二刷了,還是卡了一點時間,而且程式碼去重還沒做好,需要剪枝。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res=[]
for i in range(n-2):
if i > 0 and nums[i] == nums[i-1]:
continue
left = i+1
right = n-1
while left<right:
if nums[i] + nums[left] + nums[right] == 0:
res.append([nums[i] , nums[left] , nums[right]])
temp = nums[left]
left+=1
while nums[left] == temp and left<right:
left+=1
elif nums[i] + nums[left] + nums[right] < 0:
left+=1
else:
right-=1
return res
18. 四數之和
建議: 要比較一下,本題和 454.四數相加II 的區別,為什麼 454.四數相加II 會簡單很多,這個想明白了,對本題理解就深刻了。 本題 思路整體和 三數之和一樣的,都是雙指標,但寫的時候 有很多小細節,需要注意,建議先看影片。
題目連結/文章講解/影片講解:https://programmercarl.com/0018.四數之和.html