给你一个整数数组 nums
和一个整数 k
,按以下方法修改该数组:
- 选择某个下标
i
并将nums[i]
替换为-nums[i]
。
重复这个过程恰好 k
次。可以多次选择同一个下标 i
。
以这种方式修改数组后,返回数组 可能的最大和 。
贪心思路:
将数组排序,先将所有的负数翻转,如果此时还存在k这时候根据贪心策略,再次将数组排序,将最小的进行翻转即可。
如果k结束了,但是还存在负数,不需要处理
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
int min=200;
int index=0;
int result=0;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]<0&&k>0){
nums[i]=-1*nums[i];
k--;
}else{
break;
}
}
if(k!=0){
Arrays.sort(nums);
if(k%2==1) nums[0]=-1*nums[0];
}
for(int i=0;i<nums.length;i++){
result+=nums[i];
}
return result;
}
}
在一条环路上有 n
个加油站,其中第 i
个加油站有汽油 gas[i]
升。
你有一辆油箱容量无限的的汽车,从第 i
个加油站开往第 i+1
个加油站需要消耗汽油 cost[i]
升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas
和 cost
,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1
。如果存在解,则 保证 它是 唯一 的。
贪心策略:
整体思路:获得的所有油如果小于小消耗的,直接返回-1,不可能跑完一圈
贪心策略,获得的油和消耗的油只差为整数,并且尽可能多的从获取这种差为正数的加油站开始,实现方式,定义两个和,一个记录总和,用于最终判断,另一个记录便利过程中的局部和,如果局部和小于0说明从开始节点到当前节点,无论从哪一个出发,最终都会没油,所以不需要进行类加了,直接跟新开始节点即可。遍历完最终判断即可。
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int max=-10000000;
int start=0;
int sum=0;
int startsum=0;
for(int i=0;i<gas.length;i++){
int temp=gas[i]-cost[i];
sum+=temp;
startsum+=temp;
if(startsum<0){
start=i+1;
startsum=0;
}
}
if(sum<0) return -1;
else return start;
}
}
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目
贪心策略:
采用两次的贪心步骤,先给每一个孩子一颗糖,在分两次判断积分高低,保证局部最优,进而得到全局最优
class Solution {
public int candy(int[] ratings) {
//使用两次贪心的思路,给每一个孩子都一个谈过,设立两个条件
//先满足左条件,在满足右条件,最终返回最终结果
int[] candySum=new int[ratings.length];
candySum[0]=1;
//先给每个孩子都一个糖果,并且保证有孩子的评分大于左孩子
for(int i=1;i<ratings.length;i++){
candySum[i]=(ratings[i]>ratings[i-1])? candySum[i-1]+1:1;
}
for(int i=ratings.length-2;i>=0;i--){
if (ratings[i] > ratings[i + 1]) {
candySum[i] = Math.max(candySum[i], candySum[i + 1] + 1);
}
}
int ans = 0;
for (int num : candySum) {
ans += num;
}
return ans;
}
}
By三体直线围墙