力扣-数组的改变、移动(453、665、41)
- 数组元素改变
list[i]=a
- 数组元素插入和删除
list.append('a') # 添加
list.insert(i,'a') # 指定位置插入
list.pop() # 删除最后一个
list.pop(i) # 删除索引为i的元素
list.remove('a') # 删除某一元素
- 数组元素交换
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