comments | difficulty | edit_url | rating | source | tags | |
---|---|---|---|---|---|---|
true |
中等 |
1390 |
第 278 场周赛 Q2 |
|
给你一个下标从 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]:
l0, r1 = 0, sum(nums)
mx = r1
ans = [0]
for i, x in enumerate(nums, 1):
l0 += x ^ 1
r1 -= x
t = l0 + r1
if mx == t:
ans.append(i)
elif mx < t:
mx = t
ans = [i]
return ans
class Solution {
public List<Integer> maxScoreIndices(int[] nums) {
int l0 = 0, r1 = Arrays.stream(nums).sum();
int mx = r1;
List<Integer> ans = new ArrayList<>();
ans.add(0);
for (int i = 1; i <= nums.length; ++i) {
int x = nums[i - 1];
l0 += x ^ 1;
r1 -= x;
int t = l0 + r1;
if (mx == t) {
ans.add(i);
} else if (mx < t) {
mx = t;
ans.clear();
ans.add(i);
}
}
return ans;
}
}
class Solution {
public:
vector<int> maxScoreIndices(vector<int>& nums) {
int l0 = 0, r1 = accumulate(nums.begin(), nums.end(), 0);
int mx = r1;
vector<int> ans = {0};
for (int i = 1; i <= nums.size(); ++i) {
int x = nums[i - 1];
l0 += x ^ 1;
r1 -= x;
int t = l0 + r1;
if (mx == t) {
ans.push_back(i);
} else if (mx < t) {
mx = t;
ans = {i};
}
}
return ans;
}
};
func maxScoreIndices(nums []int) []int {
l0, r1 := 0, 0
for _, x := range nums {
r1 += x
}
mx := r1
ans := []int{0}
for i, x := range nums {
l0 += x ^ 1
r1 -= x
t := l0 + r1
if mx == t {
ans = append(ans, i+1)
} else if mx < t {
mx = t
ans = []int{i + 1}
}
}
return ans
}
function maxScoreIndices(nums: number[]): number[] {
const n = nums.length;
let [l0, r1] = [0, nums.reduce((a, b) => a + b, 0)];
let mx = r1;
const ans: number[] = [0];
for (let i = 1; i <= n; ++i) {
const x = nums[i - 1];
l0 += x ^ 1;
r1 -= x;
const t = l0 + r1;
if (mx === t) {
ans.push(i);
} else if (mx < t) {
mx = t;
ans.length = 0;
ans.push(i);
}
}
return ans;
}
impl Solution {
pub fn max_score_indices(nums: Vec<i32>) -> Vec<i32> {
let mut l0 = 0;
let mut r1: i32 = nums.iter().sum();
let mut mx = r1;
let mut ans = vec![0];
for i in 1..=nums.len() {
let x = nums[i - 1];
l0 += x ^ 1;
r1 -= x;
let t = l0 + r1;
if mx == t {
ans.push(i as i32);
} else if mx < t {
mx = t;
ans = vec![i as i32];
}
}
ans
}
}