題目1: 1005. K 次取反后最大化的數(shù)組和
- 題目鏈接:1005. K 次取反后最大化的數(shù)組和
1- 思路
貪心思路:
-
- 先對(duì)數(shù)組中的元素進(jìn)行排序
-
- 遍歷數(shù)組,如果
當(dāng)前遍歷的位置值 < 0 && k>0
直接變號(hào),之后對(duì)k
進(jìn)行--
- 遍歷數(shù)組,如果
-
- 如果不小于
0
,此時(shí)需要先排序,判斷 k 是否為奇數(shù),如果是奇數(shù)直接對(duì)最小位進(jìn)行取反
- 如果不小于
-
- 最終遍歷數(shù)組求和
2- 題解
? K 次取反后最大化的數(shù)組和 ——題解思路
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- 思路
貪心:每到一個(gè)站點(diǎn)后,此時(shí)是有補(bǔ)充有消耗的,關(guān)注點(diǎn):當(dāng)前還剩余多少油。
貪心思路:
- ① 求兩個(gè)數(shù)組的差值,記錄為
curSum
- ② 遍歷 gas 數(shù)組
- 如果
totalSum
一直大于零可以直接遍歷 - 如果
totalSum
出現(xiàn)小于 0 的情況,此時(shí) 重置和從下一個(gè)起點(diǎn)為開始點(diǎn)進(jìn)行遍歷
- 如果
代碼實(shí)現(xiàn)
-
1. 數(shù)據(jù)結(jié)構(gòu)
-
curSum
:統(tǒng)計(jì)從頭開始每一站的剩余油量和 -
totalSum
:對(duì)每站的剩余油量進(jìn)行求和 -
satrt
:記錄每次遍歷的起始站點(diǎn)下標(biāo)
-
-
2. 遍歷 gas 數(shù)組
- 此時(shí)如果
curSum > 0
此時(shí) 繼續(xù)遍歷,同時(shí)利用totalSum
記錄和 - 此時(shí)如果
curSum < 0
此時(shí) 重置satrt
和totalSum
- 最終如果
totalSum<0
則直接返回 -1 表示不能到達(dá)
- 此時(shí)如果
2- 題解
? 加油站 ——題解思路
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. 分發(fā)糖果
- 題目鏈接:135. 分發(fā)糖果
1- 思路
貪心思路:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859669.html
- ① 初始化分發(fā)情況數(shù)組
- ② 從前向后遍歷,此時(shí)判斷右邊比左邊大的情況
- ③ 從后向前遍歷,此時(shí)判斷左邊比右邊大的情況
- 難點(diǎn):從前往后遍歷 先對(duì) 分發(fā)數(shù)組 初始化,此后 從后向前 遍歷時(shí),大的那個(gè)位置的值應(yīng)該為 步驟② 和 步驟③中元素的最大值。
2- 題解
? 分發(fā)糖果 ——題解思路
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859669.html
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;
}
}
到了這里,關(guān)于【隨想錄】Day34—第八章 貪心算法 part03的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!