首页 > 其他分享 >[leetcode每日一题]11.14

[leetcode每日一题]11.14

时间:2022-11-14 11:34:02浏览次数:78  
标签:false cur nums int 11.14 leetcode 数组 true 每日

​805. 数组的均值分割​

​给定你一个整数数组 ​​nums​

我们要将 ​​nums​​​ 数组中的每个元素移动到 ​​A​​​ 数组 或者 ​​B​​​ 数组中,使得 ​​A​​​ 数组和 ​​B​​​ 数组不为空,并且 ​​average(A) == average(B)​​ 。

如果可以完成则返回​​true​​​ , 否则返回 ​​false​​  。

注意:对于数组 ​​arr​​​ ,  ​​average(arr)​​​ 是 ​​arr​​​ 的所有元素除以 ​​arr​​ 长度的和。

示例 1:

输入: nums = [1,2,3,4,5,6,7,8]
输出: true
解释: 我们可以将数组分割为 [1,4,5,8] 和 [2,3,6,7], 他们的平均值都是4.5。

示例 2:

输入: nums = [3,1]
输出: false

提示:

  • ​1 <= nums.length <= 30​
  • ​0 <= nums[i] <= 104

Solution

可以用折半查找空间换时间,因为枚举2^30个状态可能有点多,而2^15个状态就刚刚好。在枚举状态时,又可以用int的来存储nums的每一个位置。因此,将数组分成前后2段,枚举前一段的所有可能和,并存储到一个set里。再遍历后半段,如果后半段的某个和等于前半段某个和的相反数,则返回true。

注1:可以通过将每个元素减去平均值,使整个数组变成零和的。考虑到平均值可能不为整数,可以将每个元素先乘以数组长度,使得平均值肯定是整数。

注2:判断数组长度为1的情况,返回false。

注3:如果遍历到某个和为0,则返回true。

注4:需要单独判断前后两段和为相反数的情况是不是取了数组的所有元素的和,因为这样也无法分为两部分。具体来说可以存储后半段的和,如果最后遍历的和等于后半段的和,则不能算。因为如果此时没有取遍后半段所有元素,那么没取的元素的和一定为0,可以通过注3判断出来。

代码(C++)

class Solution {
public:
bool splitArraySameAverage(vector<int>& nums) {
int s = accumulate(nums.begin(), nums.end(), 0);
int l = nums.size();
if(l==1)return false;
for(int i=0;i<l;i++){
nums[i] *= l;
nums[i] -= s;
}
int m = (l+1)/2;
unordered_set<int> left;
for(int i=1;i<1<<m;i++){
int cur = 0;
for(int j=0;j<m;j++){
if(i>>j&1)cur+=nums[j];
}
if(cur == 0)return true;
left.emplace(cur);
}
int r = accumulate(nums.begin()+m, nums.end(), 0);
for(int i=1;i<1<<(l-m);i++){
int cur = 0;
for(int j=0;j<m;j++){
if(i>>j&1)cur+=nums[j+m];
}
if(left.count(-cur)&&cur!=r||cur==0) return true;
}
return false;
}
};

不过也可以转化成背包问题用dp做,存储状态的数据结构为vector<unordered_set<int>>。

标签:false,cur,nums,int,11.14,leetcode,数组,true,每日
From: https://blog.51cto.com/u_15763108/5848600

相关文章

  • [LeetCode] 805. 数组的均值分割
    设变量sum:数组的和,n:数组元素个数,tot:子数组和,cnt:子数组元素个数通过简单的公式变换可以得到:sum/n=tot/cntsum/n的值是确定的,所以也就是需要找到一个子数......
  • 【算法训练营day16】LeetCode104. 二叉树的最大深度 LeetCode559. n叉树的最大深度 Le
    LeetCode104.二叉树的最大深度题目链接:104.二叉树的最大深度初次尝试直接看题解学习思路。看完代码随想录后的想法本题使用的是二叉树的后序遍历,实际上是在求根节点......
  • leetcode622. 设计循环队列
    题目设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队......
  • 【2022.11.14】pytorch的使用相关(二)
    【2022.11.04】pytorch的初始化前言参考代码来自于:Fafa-DL/Lhy_Machine_Learning:李宏毅2021春季机器学习课程课件及作业(github.com)数据集来自于:https://github.com......
  • leetcode 70. 爬楼梯 js实现
    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例1:输入:n=2输出:2解释:有两种方法可以爬......
  • leetcode 3. 无重复字符的最长子串
    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度......
  • 蓝桥杯_每日一题Day1
    12届蓝桥杯-第四题:输入:一串乱序数字(以英文逗号隔开)输出:非最小或最大的数,输入中非连续的数样例输入:3,2,4,6,7样例输出:51.分割字符串函数split():str.split(str="",num=......
  • LeetCode 167.TowSum
    双指针classSolution{public:vector<int>twoSum(vector<int>&numbers,inttarget){intl=0,r=numbers.size()-1,sum=0;while(l<r){......
  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:相交链表
    题目:给你两个单链表的头节点 headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据......
  • LeetCode(1)
    优美子数组将输入的数组逐个取模,得到一个新的数组,计算其前缀和数组子数组(i到j)中如果恰好有K个1,即和为K,那么这个数组就满足了题目要求,有K个奇数数字转化:sum[i]-sum......