给你一个下标从 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:
def maxScoreIndices(self, nums: List[int]) -> List[int]:
left, right = 0, sum(nums)
mx = right
ans = [0]
for i, num in enumerate(nums):
if num == 0:
left += 1
else:
right -= 1
t = left + right
if mx == t:
ans.append(i + 1)
elif mx < t:
mx = t
ans = [i + 1]
return ans
class Solution {
public List<Integer> maxScoreIndices(int[] nums) {
int left = 0, right = sum(nums);
int mx = right;
List<Integer> ans = new ArrayList<>();
ans.add(0);
for (int i = 0; i < nums.length; ++i) {
if (nums[i] == 0) {
++left;
} else {
--right;
}
int t = left + right;
if (mx == t) {
ans.add(i + 1);
} else if (mx < t) {
mx = t;
ans.clear();
ans.add(i + 1);
}
}
return ans;
}
private int sum(int[] nums) {
int s = 0;
for (int num : nums) {
s += num;
}
return s;
}
}
function maxScoreIndices(nums: number[]): number[] {
const n = nums.length;
const total = nums.reduce((a, c) => a + c, 0);
let left = 0,
right = total;
let record: Array<number> = [total];
for (const num of nums) {
if (num == 0) {
left++;
} else {
right--;
}
record.push(left + right);
}
const max = Math.max(...record);
let ans: Array<number> = [];
for (let i = 0; i <= n; i++) {
if (record[i] == max) {
ans.push(i);
}
}
return ans;
}
class Solution {
public:
vector<int> maxScoreIndices(vector<int>& nums) {
int left = 0, right = accumulate(nums.begin(), nums.end(), 0);
int mx = right;
vector<int> ans;
ans.push_back(0);
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] == 0)
++left;
else
--right;
int t = left + right;
if (mx == t)
ans.push_back(i + 1);
else if (mx < t) {
mx = t;
ans.clear();
ans.push_back(i + 1);
}
}
return ans;
}
};
func maxScoreIndices(nums []int) []int {
left, right := 0, 0
for _, num := range nums {
right += num
}
mx := right
ans := []int{0}
for i, num := range nums {
if num == 0 {
left++
} else {
right--
}
t := left + right
if mx == t {
ans = append(ans, i+1)
} else if mx < t {
mx = t
ans = []int{i + 1}
}
}
return ans
}