目录
- [题目1: 1005. K 次取反后最大化的数组和](#题目1: 1005. K 次取反后最大化的数组和)
-
- [1- 思路](#1- 思路)
- [2- 题解](#2- 题解)
-
- [⭐ K 次取反后最大化的数组和 ------题解思路](#⭐ K 次取反后最大化的数组和 ——题解思路)
- [题目2: 134. 加油站](#题目2: 134. 加油站)
-
- [1- 思路](#1- 思路)
- [2- 题解](#2- 题解)
-
- [⭐ 加油站 ------题解思路](#⭐ 加油站 ——题解思路)
- [题目3: 135. 分发糖果](#题目3: 135. 分发糖果)
-
- [1- 思路](#1- 思路)
- [2- 题解](#2- 题解)
-
- [⭐ 分发糖果 ------题解思路](#⭐ 分发糖果 ——题解思路)
题目1: 1005. K 次取反后最大化的数组和
- 题目链接:1005. K 次取反后最大化的数组和
1- 思路
贪心思路:
-
- 先对数组中的元素进行排序
-
- 遍历数组,如果
当前遍历的位置值 < 0 && k>0
直接变号,之后对k
进行--
- 遍历数组,如果
-
- 如果不小于
0
,此时需要先排序,判断 k 是否为奇数,如果是奇数直接对最小位进行取反
- 如果不小于
-
- 最终遍历数组求和
2- 题解
⭐ K 次取反后最大化的数组和 ------题解思路
java
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
for(int i = 0 ; i < nums.length;i++){
if(nums[i]<0 && k > 0){
nums[i] = -nums[i];
k--;
}
}
Arrays.sort(nums);
if(k%2==1){
nums[0] = -nums[0];
}
int res = 0;
for(int i:nums){
res+=i;
}
return res;
}
}
题目2: 134. 加油站
- 题目链接:134. 加油站
1- 思路
贪心 :每到一个站点后,此时是有补充有消耗的,关注点:当前还剩余多少油。
贪心思路:
- ① 求两个数组的差值,记录为
curSum
- ② 遍历 gas 数组
- 如果
totalSum
一直大于零可以直接遍历 - 如果
totalSum
出现小于 0 的情况,此时 重置和从下一个起点为开始点进行遍历
- 如果
代码实现
- 1. 数据结构
curSum
:统计从头开始每一站的剩余油量和totalSum
:对每站的剩余油量进行求和satrt
:记录每次遍历的起始站点下标
- 2. 遍历 gas 数组
- 此时如果
curSum > 0
此时 继续遍历,同时利用totalSum
记录和 - 此时如果
curSum < 0
此时 重置satrt
和totalSum
- 最终如果
totalSum<0
则直接返回 -1 表示不能到达
- 此时如果
2- 题解
⭐ 加油站 ------题解思路
java
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int curSum = 0 ;
int totalSum = 0;
int start = 0;
for(int i = 0 ; i < gas.length;i++){
curSum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if(curSum<0){
curSum = 0;
start = i+1;
}
}
if(totalSum<0) return -1;
return start;
}
}
题目3: 135. 分发糖果
- 题目链接:135. 分发糖果
1- 思路
贪心思路:
- ① 初始化分发情况数组
- ② 从前向后遍历,此时判断右边比左边大的情况
- ③ 从后向前遍历,此时判断左边比右边大的情况
- 难点:从前往后遍历 先对 分发数组 初始化,此后 从后向前 遍历时,大的那个位置的值应该为 步骤② 和 步骤③中元素的最大值。
2- 题解
⭐ 分发糖果 ------题解思路
java
class Solution {
public int candy(int[] ratings) {
int[] candies = new int[ratings.length];
candies[0] = 1;
for (int i = 1; i < ratings.length; i++) {
if (ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
}else{
candies[i] = 1;
}
}
for(int j = ratings.length-1;j>=1;j--){
if(ratings[j]<ratings[j-1]){
candies[j-1] = Math.max(candies[j]+1,candies[j-1]);
}
}
int res = 0;
for(int r:candies){
res+=r;
}
return res;
}
}