力扣 2155. 分组得分最高的所有下标
Posted 霜序0.2℃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣 2155. 分组得分最高的所有下标相关的知识,希望对你有一定的参考价值。
题目
给你一个下标从 0 开始的二进制数组 nums
,数组长度为 n
。nums
可以按下标 i
( 0 <= i <= n
)拆分成两个数组(可能为空):numsleft
和 numsright
。
numsleft
包含nums
中从下标0
到i - 1
的所有元素**(包括**0
和i - 1
),而numsright
包含nums
中从下标i
到n - 1
的所有元素**(包括**i
和n - 1
)。- 如果
i == 0
,numsleft
为 空 ,而numsright
将包含nums
中的所有元素。 - 如果
i == n
,numsleft
将包含nums
中的所有元素,而numsright
为 空 。
下标 i
的 分组得分 为 numsleft
中 0
的个数和 numsright
中 1
的个数之 和 。
返回 分组得分 最高 的 所有不同下标 。你可以按 任意顺序 返回答案。
示例 1:
输入:nums = [0,0,1,0]
输出:[2,4]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [0,0,1,0] 。得分为 0 + 1 = 1 。
- 1 :numsleft 为 [0] 。numsright 为 [0,1,0] 。得分为 1 + 1 = 2 。
- 2 :numsleft 为 [0,0] 。numsright 为 [1,0] 。得分为 2 + 1 = 3 。
- 3 :numsleft 为 [0,0,1] 。numsright 为 [0] 。得分为 2 + 0 = 2 。
- 4 :numsleft 为 [0,0,1,0] 。numsright 为 [] 。得分为 3 + 0 = 3 。
下标 2 和 4 都可以得到最高的分组得分 3 。
注意,答案 [4,2] 也被视为正确答案。
示例 2:
输入:nums = [0,0,0]
输出:[3]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [0,0,0] 。得分为 0 + 0 = 0 。
- 1 :numsleft 为 [0] 。numsright 为 [0,0] 。得分为 1 + 0 = 1 。
- 2 :numsleft 为 [0,0] 。numsright 为 [0] 。得分为 2 + 0 = 2 。
- 3 :numsleft 为 [0,0,0] 。numsright 为 [] 。得分为 3 + 0 = 3 。
只有下标 3 可以得到最高的分组得分 3 。
示例 3:
输入:nums = [1,1]
输出:[0]
解释:按下标分组
- 0 :numsleft 为 [] 。numsright 为 [1,1] 。得分为 0 + 2 = 2 。
- 1 :numsleft 为 [1] 。numsright 为 [1] 。得分为 0 + 1 = 1 。
- 2 :numsleft 为 [1,1] 。numsright 为 [] 。得分为 0 + 0 = 0 。
只有下标 0 可以得到最高的分组得分 2 。
提示:
n == nums.length
1 <= n <= 105
nums[i]
为0
或1
解释与代码
遍历确定前缀和,找出最大的值,然后搜索即可
class Solution
public:
int arr0[100099], arr1[100099];
vector<int> ans;
vector<int> maxScoreIndices(vector<int>& nums)
int maxv;
for (int i=0; i<nums.size(); i++)
if (i == 0)
if (nums[i] == 0) arr0[i] = 1;
else arr1[i] = 1;
else
arr0[i] = arr0[i-1];
arr1[i] = arr1[i-1];
if (nums[i] == 0) arr0[i]++;
else arr1[i]++;
for (int i=0; i<=nums.size(); i++)
if (i == 0)
maxv = arr1[nums.size()-1];
else if (i == nums.size())
maxv = max(maxv, arr0[nums.size()-1]);
else
maxv = max(maxv, arr0[i-1] + arr1[nums.size()-1] - arr1[i-1]);
for (int i=0; i<=nums.size(); i++)
if (i == 0)
if (arr1[nums.size()-1] == maxv) ans.push_back(i);
else if (i == nums.size())
if (arr0[nums.size()-1] == maxv) ans.push_back(i);
else
if (arr0[i-1] + arr1[nums.size()-1] - arr1[i-1] == maxv) ans.push_back(i);
return ans;
;
以上是普通做法
即maxv有更快的求法,证明在链接里,其他差不多
以上是关于力扣 2155. 分组得分最高的所有下标的主要内容,如果未能解决你的问题,请参考以下文章