力扣-数组的改变、移动(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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
请问您要的是两个数组的交集元素还是交集元素的数量? 如果是交集元素,可以采用双指针的方式,先将两个数组排序,然后设定两个指针 i 和 j,分别指向两个数组的开头,比较两个指针所指向的元素的大小,如果相等,则说明找到了一个交集元素,将其存到结果数组中;如果不相等,则将指向小的元素的指针向后移动一位,直到其中一个指针越界为止。 代码实现如下: ```c int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ int i = 0, j = 0, k = 0; int* res = (int*)malloc(sizeof(int) * (nums1Size > nums2Size ? nums2Size : nums1Size)); // 排序 qsort(nums1, nums1Size, sizeof(int), cmp); qsort(nums2, nums2Size, sizeof(int), cmp); while (i < nums1Size && j < nums2Size) { if (nums1[i] == nums2[j]) { res[k++] = nums1[i]; i++; j++; } else if (nums1[i] < nums2[j]) { i++; } else { j++; } } *returnSize = k; return res; } int cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; } ``` 如果是交集元素的数量,可以采用哈希表的方式,用一个哈希表来记录第一个数组中的元素出现的次数,然后遍历第二个数组,在哈希表中查找是否存在相同的元素,如果存在,则说明找到了一个交集元素,将其计数并从哈希表中删除该元素,最后返回计数结果即可。 代码实现如下: ```c int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){ int i = 0, j = 0, k = 0; int* res = (int*)malloc(sizeof(int) * (nums1Size > nums2Size ? nums2Size : nums1Size)); int* hash = (int*)malloc(sizeof(int) * 1001); // 由于题目条件限制在 [0, 1000] 范围内,所以哈希表可以开得比较小 memset(hash, 0, sizeof(hash)); for (i = 0; i < nums1Size; i++) { hash[nums1[i]]++; } for (j = 0; j < nums2Size; j++) { if (hash[nums2[j]] > 0) { res[k++] = nums2[j]; hash[nums2[j]]--; } } *returnSize = k; return res; } ``` 希望这些代码能够帮到您,如有疑问请随时问我~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐小磊xl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值