Leetcode-D33-数组-66. 加一&88. 合并两个有序数组

一、复习

  1. 移除元素-双指针问题,一个指针用来记录下一个扫描哪个元素;另一个指针用来记录下一个写哪里
  2. 搜索插入位置-二分法,不断与中间位置的数字比较大小值,缩小区间范围;当两侧只差一个单位时,看val是否与两侧中的一个相等or在两个之间。

二、66. 加一

1、感觉这道题的主要问题在于进位。
2、不知道为啥错

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        for i in range(n-1,-1,-1):
            if digits[i]+1>=10:
                digits[i] = digits+1-10
                digits[i-1]+=1
            else:
                digits[i]+1
                return digits
           

3、鹅鹅鹅好智障,没赋值。赋值后还是有考虑不周全的情况
4、写的好长,主要思路就是判断是不是最后一个,来决定加不加1;判断是不是第一个,来决定要不要insert。其他的,就是>10,就进位,然后自己-1。

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

5、、看下别人怎么写的
好强啊,看倒数几位有几个9。没有9,就直接加1;有几个9,就在再往前一位变为1,后面变为0;全为就,就在最前面—加一个1,后面为0。

三、88. 合并两个有序数组

1、区分break(这个循环)和continue(本轮循环)
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.
        """
        for j in range(n):
            for i in range(m+n):
                if nums1[i]==0:
                    nums1.insert(i,nums2[j]) 
                    break   
                if nums2[j]<nums1[i]:
                    nums1.insert(i,nums2[j])
                    break
        del(nums1[m+n:])

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.
        """
        del(nums1[m:])
        for j in range(n):
            for i in range(m+j):   
                if nums2[j]<nums1[i]:
                    nums1.insert(i,nums2[j])
                    break
                if i==m+j-1: 
                    nums1.insert(i+1,nums2[j]) 

4、一行送走,绝绝子。时间复杂度:平均情况为 O((m+n)\log(m+n))O((m+n)log(m+n))。

  nums1[m:] = nums2
        nums1.sort()

5、再借用一个空间,用双指针也可以。被之前的省空间的思维禁锢了,这里没有这个条件。nums1[:]=sorted和nums1=sorted[:]不一样

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.
        """
        sorted = []
        p,q=0,0
        while(p!=m or q!=n):
            if p==m:
                sorted.append(nums2[q])
                q +=1
            elif q==n:
                sorted.append(nums1[p])
                p +=1
            else:
                if nums1[p]>nums2[q]:
                    sorted.append(nums2[q])
                    q+=1
                else:
                    sorted.append(nums1[p])
                    p+=1
        nums1[:]=sorted
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值