题目
解题思路
- 根据nums的下标分组,分成numsleft和numsright,其中numsleft的得分为区间内0的个数,而numsright的得分为区间内1的个数,而且nums[i]不是0就是1,所以可以先求出nuns[i]的前n项和。
- 然后创建一个score数组,则score[i]是以i为下标进行分组的得分。
- 可知numsright为1的个数,其实就是该区间内的和,因为nums[i]不是0就是1,比如[0,1,1]这个区间和为2,那么1的个数就是2。
Code
class Solution {
public List<Integer> maxScoreIndices(int[] nums) {
int[] presum = new int[nums.length+1];
//preSum[i]为前i项和
for(int i=0;i<nums.length;i++){
presum[i+1] = presum[i] + nums[i];
}
//i就为下标,值为得分
int[] score = new int[nums.length+1];
for(int left=0;left<=nums.length;left++){
if(left==0){ //特判
score[left] = presum[presum.length-1];
}else if(left==nums.length){ //特判
score[left] = nums.length-presum[presum.length-1];
}else{
int numsleft = left - presum[left];
int numsright = presum[presum.length-1] - presum[left];
score[left] = numsleft+numsright;
}
}
int maxscore = -1;
for(int i=0;i<score.length;i++){
if(score[i] > maxscore){
maxscore = score[i];
}
}
List<Integer> res = new ArrayList<>();
for(int i=0;i<score.length;i++){
if(score[i] == maxscore){
res.add(i);
}
}
return res;
}
}
运行结果截图