LeetCode 每日一题 2025/7/28-2025/8/3
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 7/28 2044. 统计按位或能得到最大值的子集数目
- 7/29 2411. 按位或最大的最小子数组长度
- 7/30 2419. 按位与最大的最长子数组
- 7/31 2683. 相邻值的按位异或
- 8/1 118. 杨辉三角
- 8/2 2561. 重排水果
- 8/3
7/28 2044. 统计按位或能得到最大值的子集数目
所有数都按位或必定是最大
n位数一共有2^n种可能 用一个n为二进制表示选择的数
如果得到目标值 结果+1
def countMaxOrSubsets(nums):""":type nums: List[int]:rtype: int"""target = 0for num in nums:target |=numn = len(nums)ans = 0for i in range(1,2**n):v = 0for loc in range(n):if i&(1<<loc)>0:v |=nums[loc]if v==target:ans +=1return ans
7/29 2411. 按位或最大的最小子数组长度
当前数值num
如果二进制第i位为1 那么后续不论如何操作肯定是1
如果第i位为0 为了使或值最大 需要后面最近的一个第i位为1的数值
pos[i]记录该二进制位在后续数字钟最近为1的位置
从后往前遍历
def smallestSubarrays(nums):""":type nums: List[int]:rtype: List[int]"""n=len(nums)pos=[-1]*31ans=[0]*nfor i in range(n-1,-1,-1):j=ifor bit in range(31):if (nums[i]&(1<<bit))==0:if pos[bit]!=-1:j=max(j,pos[bit])else:pos[bit]=ians[i]=j-i+1return ans
7/30 2419. 按位与最大的最长子数组
两数按位与 结果不会大于两个数中的较大值
题目可以转换为 数组中最大值连续最长有几位
def longestSubarray(nums):""":type nums: List[int]:rtype: int"""maxv=max(nums)cur,ans=0,0if nums[0]==maxv:cur=1for i in range(1,len(nums)):if nums[i]==maxv:cur+=1else:ans=max(cur,ans)cur=0return max(ans,cur)
7/31 2683. 相邻值的按位异或
将derived所有数异或 及将原始数组每个数异或了两次
如果存在原始数组必定结果为0
def doesValidArrayExist(derived):""":type derived: List[int]:rtype: bool"""ans=0for v in derived:ans ^=vreturn ans==0
8/1 118. 杨辉三角
按题意一行行生成
def generate(numRows):""":type numRows: int:rtype: List[List[int]]"""if numRows==1:return [[1]]cur=[1]ans=[[1]]for i in range(numRows-1):tmp=[1]for j in range(len(cur)-1):tmp.append(cur[j]+cur[j+1])tmp.append(1)ans.append(tmp)cur=tmp[:]return ans
8/2 2561. 重排水果
要满足最后两边一样 任意成本必须出现偶数次
统计两个果篮成本出现次数count1,count2
对于某个成本x 必须满足count1[x]+count2[x]为偶数
如果count1[x]>count2[x] 说明需要从果篮1交换(count1[x]-count2[x])/2 到果篮2
反之亦然
将需要交换的成本放入带交换list中 从小到大排序
为了成本最低 将最小成本与最大成本交换
直接交换成本x1
间接交换通过最小值m (x1,m) (m,x2)通过两次交换完成x1,x2的互换 成本m*2
def minCost(basket1, basket2):""":type basket1: List[int]:type basket2: List[int]:rtype: int"""from collections import Counterc=Counter()m=float('inf')for b in basket1:c[b]+=1m=min(m,b)for b in basket2:c[b]-=1m=min(m,b)l=[]for v,num in c.items():if num%2:return -1l.extend([v]*(abs(num)//2))if not l:return 0l.sort()ans=0for x in l[:len(l)//2]:ans+=min(2*m,x)return ans
8/3