贪心+暴力模拟,100%
由第一种方法可以产生一种递归方法,以最小点分割数组,递归两个子数组,递归只能过65%。
如下代码:注释中为贪心+模拟,
最佳思路:递增数组(评论区大佬)
package org.niuke.solution78; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { static int cnt = 0; public static void help(int[] arr, int minPre){ if(arr.length <= 0){return;} if(arr.length == 1){ cnt += arr[0]-minPre; return; } int min = Integer.MAX_VALUE, minIndex = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] < min){ min = arr[i]; minIndex = i; } } cnt += min - minPre; if(minIndex>0)help(Arrays.copyOfRange(arr, 0, minIndex), min); if(minIndex<arr.length-1)help(Arrays.copyOfRange(arr, minIndex + 1, arr.length), min); } public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] ints = new int[n]; for(int i = 0; i < n; i++){ ints[i] = scanner.nextInt(); } //注释部分为暴力模拟 // int index = 0, cnt = 0; // while (index < ints.length) { //// System.out.println(Arrays.toString(ints)); // while (index < n && ints[index] == 0) { // index++; // } // for(int i = index; i < n; i++){ // if(ints[i] == 0){ // break; // }else{ // ints[i]--; // } // } // if(index < n){ // cnt++; // } // } // System.out.println(cnt); help(ints, 0); System.out.println(cnt); } }