题解 | #分糖果问题#
分糖果问题
https://www.nowcoder.com/practice/76039109dd0b47e994c08d8319faa352
package com.hhdd.贪心; /** * 不会做 * * @Author huanghedidi * @Date 2022/8/11 22:54 */ public class 分糖果问题 { public static void main(String[] args) { // int[] arr = {1, 4, 2, 7, 9}; // int[] arr = {10,4,10,10,4}; // 46才对 int[] arr = {8, 9, 8, 7, 6, 5, 4, 3, 2, 1}; int res = candy3(arr); System.out.println("res = " + res); } public static int candy(int[] arr) { // write code here int length = arr.length; int res = length; // 降序flag int descFlag = 0; // 升序flag int ascFlag = 0; // 相等flag int euityFlag = 0; for (int i = 1; i < length; i++) { // 降序会改变flag,升序重置flag if (arr[i] < arr[i - 1]) { if (euityFlag != 0) { if (ascFlag != 0) { // 如果是先升后降则相当于是峰值 res += euityFlag; ascFlag = 0; continue; } else { descFlag += euityFlag; } euityFlag = 0; } ascFlag = 0; if (i == 1 || (i >= 2 && arr[i - 1] <= arr[i - 2])) { descFlag++; } res += descFlag; } else if (arr[i] > arr[i - 1]) { descFlag = 0; if (euityFlag != 0) { if (ascFlag != 0) { res += euityFlag; } euityFlag = 0; } ascFlag++; res += ascFlag; } else { // 相等 euityFlag++; } } // 最后是递增且相同的趋势 if (euityFlag != 0 && ascFlag != 0) { res += euityFlag; euityFlag = 0; } return res; } public static int candy2(int[] arr) { int up = 0, down = 0, peak = 1, res = 1; for (int i = 1; i < arr.length; i++) { res++; if (arr[i] > arr[i - 1]) { up++; res += up; down = 0; peak = up + 1; } else if (arr[i] == arr[i - 1]) { up = 0; down = 0; peak = 1; } else { up = 0; res += down; down++; if (down >= peak) res++; } } return res; } public static int candy3(int[] arr) { // write code here int length = arr.length; int res = length; // 降序flag int descFlag = 0; // 升序flag int ascFlag = 0; // 记录上升的极值点 int peak = 0; for (int i = 1; i < length; i++) { // 降序会改变flag,升序重置flag if (arr[i] < arr[i - 1]) { // 降序会遇到极大值问题 如果升序的坡度比降序来的高则不需要改变极值点的值 // 否则需要++ // 不是很好理解 ascFlag = 0; descFlag++; res += descFlag - 1; if (descFlag > peak) { res++; } } else if (arr[i] > arr[i - 1]) { descFlag = 0; ascFlag++; peak = ascFlag; res += ascFlag; } else { // 相等 ascFlag = 0; descFlag = 0; peak = 0; } } return res; } }