力扣刷题 day31:09-30

1.和有限的最长子序列

给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度  。

子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。力扣刷题 day31:09-30_第1张图片

方法一:排序+二分法+前缀和 

#方法一:排序+二分法+前缀和
def answerQueries(nums,queries):
    nums=sorted(nums) #先排序
    res=[]
    preSum=[0 for i in range(len(nums)+1)]
    for i in range(1,len(nums) +1):
        preSum[i]=preSum[i-1]+nums[i-1] #前缀和数组
    for i in range(len(queries)):
        left,right=0,len(nums)
        while left<=right:  #二分法查找,第一个比目标值大的位置
            mid=left+(right - left)//2
            if preSum[mid]>queries[i]:
                right=mid-1
            elif preSum[mid]<=queries[i]:
                left=mid+1
        res.append(left-1)
    return res

2.找出中枢整数

给你一个正整数 n ,找出满足下述条件的 中枢整数 x :

1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。
返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中

枢整数。 

力扣刷题 day31:09-30_第2张图片

方法一:前缀和

#方法一:前缀和
def pivotInteger(n):
    total=n*(n+1)//2 #求和公式
    preSum=0  #前缀和
    for i in range(1,n+1):
        preSum+=i
        if total-preSum+i==preSum: #判断是否有对应的整数
            return i
    return -1

3.左右元素和的差值

给你一个下标从 0 开始的整数数组 nums ,请你找出一个下标从 0 开始的整数数组 answer ,其中:

answer.length == nums.length
answer[i] = |leftSum[i] - rightSum[i]|
其中:

leftSum[i] 是数组 nums 中下标 i 左侧元素之和。如果不存在对应的元素,leftSum[i] = 0 。
rightSum[i] 是数组 nums 中下标 i 右侧元素之和。如果不存在对应的元素,rightSum[i] = 0 。
返回数组 answer 。力扣刷题 day31:09-30_第3张图片

方法一:前缀和 

#方法一:前缀和
def leftRightDifference(nums):
    left=[0 for i in range(len(nums)+1)]  #前缀和
    right =[0 for i in range(len(nums)+1)]
    res=[]
    s=sum(nums) #求出数组总和
    for i in range(1,len(nums)+1):
        left[i]=left[i-1]+nums[i-1]  #左数组
        right[i]=s-left[i-1]-nums[i-1]  #右数组
        res.append(abs(left[i-1]-right[i])) #计算
    return res

你可能感兴趣的:(力扣刷题,leetcode,数据结构,算法)