贪心算法(两个维度维权问题)
1.分发糖果
1.先从左向右遍历,当右面孩子的评分大于左面孩子的,右面孩子糖果数等于左面孩子糖果数加一。
2.再从右向左遍历,只要左边比右边大,此时左边的糖果(符合比它左边大)和右边糖果数加一二者的最大值。这样才符合它比它左边的大,也比它右边的大。
class Solution {
public int candy(int[] ratings) {
int[] candyVec = new int[ratings.length];
candyVec[0]=1;
//从左向右遍历,右边孩子评分高的多拿一个糖果
for(int i=1;i<ratings.length;i++){
if(ratings[i-1]<ratings[i]){
candyVec[i]=candyVec[i-1]+1;
}else{
candyVec[i]=1;
}
}
//从右向左遍历,只要左边比右边大,此时左边的糖果(符合比它左边大)和右边糖果数加一二者的最大值
//这样才符合它比它左边的大,也比它右边的大
for(int i=ratings.length-2;i>=0;i--){
if(ratings[i+1]<ratings[i]){
candyVec[i]= Math.max(candyVec[i],candyVec[i+1]+1);
}
}
int ans = 0;
for(int s:candyVec){
ans+=s;
}
return ans;
}
}
2. 根据身高重建队列
身高从大到小排列(身高相同的k小的排在前面)
class Solution {
public int[][] reconstructQueue(int[][] people) {
//身高从大到小排列(身高相同的k小的排在前面)
Arrays.sort(
people,(a,b) ->{
if(a[0]==b[0]) return a[1]-b[1];
return b[0]-a[0];
}
);
LinkedList<int[]> ans = new LinkedList<>();
for(int[]p:people){
ans.add(p[1],p);
}
return ans.toArray(new int[people.length][]);
}
}