力扣---数组

题目

  1. 2016. 增量元素之间的最大差值
  2. 2239. 找到最接近 0 的数字
  3. 1475. 商品折扣后的最终价格
  4. 2248. 多个数组求交集
  5. 1588. 所有奇数长度子数组的和
  6. 1848. 到目标元素的最小距离
  7. 1652. 拆炸弹
  8. 1640. 能否连接形成数组

解题思路与代码详情

【题1】2016. 增量元素之间的最大差值

2016. 增量元素之间的最大差值: 给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] , 返回 最大差值 。
如果不存在满足要求的 i 和 j ,返回 -1 。

题目解析: 题目要求 n u m s [ j ] − n u m s [ i ] nums[j] - nums[i] nums[j]nums[i], 0 < = i < j < n 0 <= i < j < n 0<=i<j<n n u m s [ i ] < n u m s [ j ] nums[i] < nums[j] nums[i]<nums[j],即所求结果为后项减前项的差,且需要后项的数值大于前项,若所有后项数值都不大于前项,则结果返回 -1。
解题思路:

  1. 暴力枚举:遍历数组中元素, 确定数组中元素相减的差,同时针对数组中元素的前后项大小关系的情况,设置指标性变量,一旦 n u m s [ i ] < n u m s [ j ] nums[i] < nums[j] nums[i]<nums[j]的情况出现,即求返回结果,同时指标性变量发生变化。
# python3
class Solution:
    def maximumDifference(self, nums: List[int]) -> int:
        n = len(nums)
        ans = -max(nums)
        flag = 0
        for i in range(n):
            for j in range(i+1, n):
                if nums[i]<nums[j]:
                    flag = 1
                ans = max(ans, nums[j]-nums[i])
        if flag==0:
            ans = -1
        return ans
//C
int maximumDifference(int* nums, int numsSize){
    int ans = -1000;
    int flag = 0;
    for(int i=0;i<numsSize;i++){
        for(int j=i+1; j<numsSize; j++){
            if(nums[i] < nums[j]){
                flag = 1;
            }
            ans = fmax(ans, nums[j]-nums[i]);
        }
    }
    if (flag == 0){
        ans = -1;
    }
    return ans;
}
  1. 前缀最小值(官方解答版)
    解题思路: 求后项减去前项的最大值,那么需要在数组的前一部分找一个最小值,后一部分找一个最大值,所以可以设定一个变量premin用于存储前半部分的最小值,先固定这个premin值,然后逐一遍历数组元素,一旦存在nums[i]大于当前固定的premin值,就执行返回结果的操作,否则更新以nums[i]的值来更新premin的取值。同时考虑到数组可能会存在所有后项元素都不大于前项元素的情况,先设定返回值为-1。
#python 3
class Solution:
    def maximumDifference(self, nums: List[int]) -> int:
        n = len(nums)
        ans = -1
        premin = nums[0]
        for i in range(n):
            if nums[i]>premin:
                ans = max(ans, nums[i]-premin)
            else:
                premin = nums[i]
        return ans
//C
int maximumDifference(int* nums, int numsSize){
    int premin = nums[0];
    int ans = -1;
    for(int i=0; i<numsSize; i++){
        if(nums[i]>premin){
            ans = fmax(ans, nums[i]-premin);
        }else{
            premin = nums[i];
        }
    }
    return ans;
}

【题2】2239. 找到最接近 0 的数字

2239. 找到最接近 0 的数字: 给你一个长度为 n 的整数数组 nums ,请你返回 nums 中最 接近 0 的数字。如果有多个答案,请你返回它们中的 最大值 。

#python3
class Solution:
    def findClosestNumber(self, nums: List[int]) -> int:
        n = len(nums)
        ans = nums[0]
        for i in range(1,n):
            if abs(nums[i])<abs(ans):
                ans = nums[i]
            if abs(nums[i])==abs(ans):
                ans = max(ans, nums[i])
        return ans
//C
int findClosestNumber(int* nums, int numsSize){
    int ans = nums[0];
    for(int i=1;i<numsSize;i++){
        if(abs(nums[i]) < abs(ans)){
            ans = nums[i]; 
        }
        if(abs(nums[i]==abs(ans))){
            ans = fmax(ans, nums[i]);
        }
    }
    return ans;
}

【题3】1475. 商品折扣后的最终价格

1475. 商品折扣后的最终价格: 给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。

商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相等的折扣,其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足条件的 j ,你将没有任何折扣。

请你返回一个数组,数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。

#python3
class Solution:
    def finalPrices(self, prices: List[int]) -> List[int]:
        n = len(prices)
        ret = [0]*n
        for i in range(n-1):
            temp=0
            for j in range(n-1,i,-1):
                if prices[j] <= prices[i]:
                    temp = j
            if temp==0:
                ret[i]=prices[i]
            else:
                ret[i]=prices[i]-prices[temp]
        ret[n-1]=prices[n-1]
        return ret

//C
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* finalPrices(int* prices, int pricesSize, int* returnSize){
    int *ret = (int *)malloc(sizeof(int)*pricesSize);
    *returnSize = pricesSize;
    for(int i =0;i<pricesSize-1;i++){
        int temp=0;
        for(int j=pricesSize-1;j>i;j--){
            if(prices[j] <= prices[i]){
                temp=j;
            }
            if(temp==0){
            ret[i]=prices[i];
            }
            else{
                ret[i]=prices[i]-prices[temp];
            }  
        } 
    }
    ret[pricesSize-1]=prices[pricesSize-1];
    return ret;
    free(ret);
}

【题4】2248. 多个数组求交集

2248. 多个数组求交集: 给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组 中都出现过。

class Solution:
    def intersection(self, nums: List[List[int]]) -> List[int]:
        n = len(nums)
        s=set(nums[0])
        for i in range(1,n):
            s = s.intersection(nums[i])
        ret = list(s)
        ret.sort()
        return ret

【题5】1588. 所有奇数长度子数组的和

1588. 所有奇数长度子数组的和: 给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。

子数组 定义为原数组中的一个连续子序列。

请你返回 arr 中 所有奇数长度子数组的和

class Solution:
    def sumOddLengthSubarrays(self, arr: List[int]) -> int:
        n = len(arr)
        sums = 0
        for i in range(n):
            for j in range(i,n):
                if (j-i+1)%2==1:
                    sums = sums+sum(arr[i:j+1])
        return sums

【题6】1848. 到目标元素的最小距离

1848. 到目标元素的最小距离: 给你一个整数数组 nums (下标 从 0 开始 计数)以及两个整数 target 和 start ,请你找出一个下标 i ,满足 nums[i] == target 且 abs(i - start) 最小化 。注意:abs(x) 表示 x 的绝对值。

返回 abs(i - start) 。

题目数据保证 target 存在于 nums 中。

class Solution:
    def getMinDistance(self, nums: List[int], target: int, start: int) -> int:
        minret = 10000
        n = len(nums)
        for i in range(n):
            if nums[i]==target:
                minret = min(minret,abs(i-start)) 
        return minret

【题7】1652. 拆炸弹

1652. 拆炸弹: 你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。

为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。

如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和替换。
如果 k < 0 ,将第 i 个数字用 之前 k 个数字之和替换。
如果 k == 0 ,将第 i 个数字用 0 替换。

由于 code 是循环的, code[n-1] 下一个元素是 code[0] ,且 code[0] 前一个元素是 code[n-1] 。

给你 循环 数组 code 和整数密钥 k ,请你返回解密后的结果来拆除炸弹!

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ret = [0]*n
        for i in range(n):
            if k==0:
                ret[i]=0
            else:
                for j in range(1,abs(k)+1):
                    if k>0:
                        ret[i]=ret[i]+code[(i+j)%n]
                    else:
                        ret[i]=ret[i]+code[(i-j)%n]
        return ret

【题8】1640. 能否连接形成数组

1640. 能否连接形成数组: 给你一个整数数组 arr ,数组中的每个整数 互不相同 。另有一个由整数数组构成的数组 pieces,其中的整数也 互不相同 。请你以 任意顺序 连接 pieces 中的数组以形成 arr 。但是,不允许 对每个数组 pieces[i] 中的整数重新排序。

如果可以连接 pieces 中的数组形成 arr ,返回 true ;否则,返回 false

class Solution:
    def canFormArray(self, arr: List[int], pieces: List[List[int]]) -> bool:
        narr = len(arr)
        mpieces = len(pieces)
        flag = True
        for i in range(mpieces):#遍历pieces数组的子数组
            tempn = len(pieces[i])#计算子数组的长度
            tempj=0
            for j in range(narr):
                if pieces[i][0]==arr[j]:
                    tempj = j
                continue
            if tempj+tempn<=narr:
                for k in range(tempn):
                    if pieces[i][k]==arr[tempj+k]:
                        flag = True
                    else:
                        flag = False
            else:
                flag =False
            if flag == False:
                break
        return flag

参考文献

  1. https://blog.csdn.net/WhereIsHeroFrom/article/details/124522256
  2. https://blog.csdn.net/WhereIsHeroFrom/article/details/125076627
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值