力扣-数组的改变、移动(453、665、41)

力扣-数组的改变、移动(453、665、41)

  1. 数组元素改变
list[i]=a
  1. 数组元素插入和删除
list.append(a) # 添加
list.insert(i,a) # 指定位置插入
list.pop() # 删除最后一个
list.pop(i) # 删除索引为i的元素
list.remove(a) # 删除某一元素
  1. 数组元素交换
list[i],list[j] = list[j],list[i]   # 交换 i,j 位置元素

最小操作次数使数组元素相等(453)

思路: 首先当执行完后,所有元素都会等于一个target,这个target需要满足,targetlen(nums)=sum(nums)+k(len(nums)-1),这里k表示执行多少次操作。那接下来就是确定好target就可以求出K了,对于nums中最小的那个数,每次执行时都会+1,因为如果最小值都不+1,那么最小值只会离其他值更远,所以为了得到最小执行次数,target=min(nums)+k。代入到刚才的式子中求得结果为 sum(nums)-min(nums)*len(nums) 。

class Solution:
    def minMoves(self, nums: List[int]) -> int:
        return sum(nums)-min(nums)*len(nums)

非递减数列(665)

思路: 设置一个count来计算数列中下降的部位个数,如果有两个地方都有下降,那么仅改变一个元素是不能变成一个非递减数列的。但是存在一个下降的部位,也不一定就能通过改变一个元素就形成非递减数列,存在特殊情况: 特殊情况: 如果 i 位置发生下降,且 nums[i-2]>nums[i] 或者 nums[i-1] >nums[i+1] ,如果这样的情况,该部位并不能通过改变一个元素来形成非递减数列。

class Solution:
    def checkPossibility(self, nums: List[int]) -> bool:
        count=0
        for i in range(1,len(nums)):
            if nums[i]<nums[i-1]:
                count=count+1
                if i-2>=0 and i+1<len(nums):
                    if nums[i-2]>nums[i] and nums[i-1]>nums[i+1]:
                        return False
        if count>1:
            return False
        return True

缺失得第一个正数(41)

思路: 设置一个 j ,表示下一个本需要出现得正整数,遍历数组,从第一个大于0的数开始,如果nums[i]==j,说明 j 代表的这个整数出现了,这时 需要 j+1,表示需要下一个正整数,依此进行下去,直到遍历完,j 最后的值就是代表没有出现过的正整数。

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        j=1
        nums.sort()
        for i in range(len(nums)):
            if nums[i]>0:
                if nums[i]==j:
                    j=j+1
        return j
经验分享 程序员 微信小程序 职场和发展