从零开始刷Leetcode——数组(66.88)

文章目录

  • 66.加一
  • 88.合并两个有效数组

本次是66、88

66.加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

例如,[9, 9]加一变成[1, 0, 0]

1.反向遍历

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        length = len(digits)
        flag = 1
        for i in range(length-1, -1, -1):
            if digits[i] != 9:
                digits[i] += flag
                flag = 0
            elif flag == 1:
                digits[i] = 0
        if flag == 1:
            return [1] + digits
        else:
            return digits

设置进位标志位,从最后一位开始遍历,和计算正常加法差不多,44ms

2.转成字符串做加法再转回去


class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        ##先变成一个整的数字,然后做加法,然后转换成str,再转int加到新的list中
        nums_str = ""
        for i in digits:
            nums_str =nums_str+str(i)
    
        nums_int = int(nums_str)+1
        res = []
        for i in str(nums_int):
            res.append(int(i))
        return res

32ms, 13,6MB

3.思路差不多,写法不一样

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        length = len(digits)
        flag = 1
        for i in range(length-1, -1, -1):
            if digits[i] == 9:
                digits[i] = 0
            else:
                digits[i] += 1
                return digits
        digits.append(0)
        digits[0] = 1
        return digits

32ms,13.5MB

88.合并两个有效数组

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

1.偷懒

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        nums1[m:m+n] = nums2
        nums1.sort()

两个列表合并到一起,直接排序,纯属偷懒,40ms,13.7MB

2.双指针从后往前插值

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        end=m+n-1
        end_1=m-1
        end_2=n-1
        while(end_1>=0 and end_2>=0):
            if(nums1[end_1]>=nums2[end_2]):
                nums1[end]=nums1[end_1]
                end_1-=1
                end-=1
            else:
                nums1[end]=nums2[end_2]
                end_2-=1
                end-=1
        nums1[:end_2+1]=nums2[:end_2+1]

40ms,13.7MB

3.双指针正向插值,利用新列表

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        l1=0
        l2=0
        nums_copy=nums1[:m]
        i=0
        while(l1<m and l2<n):
            if(nums_copy[l1]<nums2[l2]):
                nums1[i]=nums_copy[l1]
                l1+=1
            else:
                nums1[i]=nums2[l2]
                l2+=1
            i+=1
        if(l1<m):
            nums1[i:m+n]=nums_copy[l1:m]
        if(l2<n):
            nums1[i:m+n]=nums2[l2:n]

44ms,13.7MB

你可能感兴趣的:(leetcode,leetcode)