LeetCode刷題筆記(一)數(shù)組

一. 數(shù)組

數(shù)組題目經(jīng)常會使用到循環(huán),背以下三種循環(huán)方式:

for idx, x in enumerate(nums): # 正向循環(huán)
    print(x)
for idx in range(0, len(nums), 1): # 正向循環(huán)
    print(nums[idx])
for idx in range(len(nums)-1, -1, -1): # 反向循環(huán)
    print(nums[idx])
26. 刪除有序數(shù)組中的重復(fù)項

題目描述:給你一個有序數(shù)組 nums ,請你 原地 刪除重復(fù)出現(xiàn)的元素,使每個元素 只出現(xiàn)一次 ,返回刪除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。
輸入:nums = [1,1,2]
輸出:2, nums = [1,2]

    def removeDuplicates(self, nums: List[int]) -> int:
        if len(nums) == 0: # 邊界條件
            return 0
        cur = nums[0] # 初始化第0個數(shù)
        i_cur = 1 
        for idx in range(1, len(nums)): # 從第1個數(shù)開始循環(huán)
            if nums[idx] != cur: # 找不同的數(shù),填值到數(shù)組的前邊。
                nums[i_cur] = nums[idx]
                cur = nums[i_cur]
                i_cur += 1
        return i_cur
66. 加一

題目:加1
輸入:digits = [1,2,3]
輸出:[1,2,4]

    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        if digits[n-1] < 9: # 末尾數(shù)不是9 就很好解決
            digits[n-1] += 1
            return digits
        flag = False # 如果數(shù)組里全是9,則flag值為True
        for i in range(n-1, -1, -1):
            if digits[i] == 9: # 逆向找9
                digits[i] = 0
                if i == 0:
                    flag = True
            else: # 逆向找到不是9,就可以停了
                digits[i] += 1
                break
        if flag == True:
            digits.insert(0, 1) # 如果數(shù)組里全是9,在頭部填1
        return digits
88. 合并兩個有序數(shù)組

題目描述:給你兩個有序整數(shù)數(shù)組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數(shù)組。
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
思考:如果你想正向的填數(shù),那代碼會出現(xiàn)很多判斷和切片賦值。學(xué)會逆向思考。

    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        if n == 0: # 邊界條件
            return nums1
        idx_1 = m - 1 # nums1的下標(biāo)
        jdx_2 = n - 1 # nums2的下標(biāo)
        index_final = m + n - 1 # 最后返回的nums1的下標(biāo)
        while jdx_2 >= 0 and idx_1 >= 0: # 逆向循環(huán),找大填數(shù)
            if nums1[idx_1] > nums2[jdx_2]:
                nums1[index_final] = nums1[idx_1]
                idx_1 = idx_1 - 1
            else:
                nums1[index_final] = nums2[jdx_2]
                jdx_2 = jdx_2 - 1
            index_final = index_final - 1
        if index_final >= 0 and jdx_2 >= 0: # 如果nums2還有剩下的數(shù),全部仿真nums1的前端
            nums1[0: index_final+1] = nums2[0: index_final+1]
        return nums1
228. 匯總區(qū)間

題目:匯總區(qū)間
輸入:nums = [0,1,2,4,5,7]
輸出:["0->2","4->5","7"]

    def summaryRanges(self, nums: List[int]) -> List[str]:
        res = []
        if len(nums) == 0:
            return res
        start = nums[0]
        for i in range(0, len(nums)-1):
            if nums[i] + 1 != nums[i+1]: # 查看數(shù)組間隔不為1就要輸出了
                if start != nums[i]:
                    res.append(str(start) + '->' + str(nums[i]))
                    start = nums[i+1]
                else:
                    res.append(str(start))
                    start = nums[i+1] # 記錄當(dāng)前的start
        # 收尾工作
        if start == nums[-1]: # 到達最后一個
            res.append(str(start)) # 如果一樣只填一個數(shù)
        else:
            res.append(str(start) + '->' + str(nums[-1])) # 如果不一樣填一個區(qū)間
        return res
283. 移動零

題目描述:給定一個數(shù)組 nums,編寫一個函數(shù)將所有 0 移動到數(shù)組的末尾,同時保持非零元素的相對順序。
輸入:[0,1,0,3,12]
輸出:[1,3,12,0,0]

    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        left = right = 0 # 雙指針法
        while right < n:
            if nums[right] != 0:
                nums[left], nums[right] = nums[right], nums[left]
                left += 1 # left用來記錄第幾個非0元素
            right += 1 # 不停的循環(huán)向前移動
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容