力扣刷题 day33:10-02

1.连续的子数组和

给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:

子数组大小 至少为 2 ,且
子数组元素总和为 k 的倍数。
如果存在,返回 true ;否则,返回 false 。

如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。

力扣刷题 day33:10-02_第1张图片

方法一:动态规划,找出对应的变化 

#方法一:动态规划,找出对应的变化
def maxSubArray(nums):
    res,cur=nums[0],nums[0]  #cur表示当前位置的最大值
    for i in range(1,len(nums)):
        if cur<0 and nums[i]>cur:
            cur=nums[i]  #要保证加上这一个数字比原来的大,否则就从当前数字开始重新连续
        else:
            cur+=nums[i]
        res=max(cur,res)  #在i位置,要么就是最大和不变,要么就是原来的加上现在自己的,
                                   #要么就是从当前位置重新开始开始
    return res

2.连续数组

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

力扣刷题 day33:10-02_第2张图片

 方法一:前缀和+哈希表

#方法一:前缀和+哈希表
def findMaxLength(nums):
    prefix={0:-1} #记录下标和对应的值
    cur_sum,res = 0,0 #因为当两个cur_sumx相等时候相减即为0,满足题意
    for i in range(len(nums)):
        if nums[i]==0:
            cur_sum-=1
        else:
            cur_sum+=1  #遇到0则-1,遇到1则加1
        if cur_sum in prefix:
            res=max(res,i-prefix[cur_sum])  #记录最早出现的cur_sum值
        elif cur_sum not in prefix:
            prefix[cur_sum]=i
    return res

3.按权重随机选择

给你一个 下标从 0 开始 的正整数数组 w ,其中 w[i] 代表第 i 个下标的权重。

请你实现一个函数 pickIndex ,它可以 随机地 从范围 [0, w.length - 1] 内(含 0 和 w.length - 1)选出并返回一个下标。选取下标 i 的 概率 为 w[i] / sum(w) 。

例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。力扣刷题 day33:10-02_第3张图片

class Solution:

    def __init__(self, w: List[int]):
        self.prefix_sum=[0]*len(w)
        self.prefix_sum[0]=w[0]
        for i in range(1,len(w)):
            self.prefix_sum[i]=self.prefix_sum[i-1]+w[i]
        print(self.prefix_sum)

    def pickIndex(self) -> int:
        seed=random.randint(1,self.prefix_sum[-1])
        index=bisect_left(self.prefix_sum,seed)
        return index



# Your Solution object will be instantiated and called as such:
# obj = Solution(w)
# param_1 = obj.pickIndex()

 

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)