Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和

forrestr發表於2024-05-29

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

相關文章