华为OD机试真题 Java 实现【水库蓄水问题】
前言
博主刷的华为机考题,代码仅供参考,因为没有后台数据,可能有没考虑到的情况
如果感觉对你有帮助,请点点关注点点赞吧,谢谢你!
题目描述
思路
1. 其实就是找一个最大的水坑,两个边界中不能有比边界高的
2. 双指针:l=0,r=s.lenght-1,求中间的蓄水量,如果中间有更高的之久就返回-1
3.求中间的蓄水量
代码
import java.util.Arrays;
import java.util.Scanner;// 1 8 6 2 5 4 8 3 7
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);Integer[] nums = Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);int l=0,r=nums.length-1;int ll=l,rr=r,max=0;while(l<r-1){int maxNum=getNum(nums,l,r);if(maxNum>=max){max=maxNum;ll=l;rr=r;}if(nums[l]<nums[r]){l++;}else{r--;}}if(max==0)System.out.println(0);else System.out.println(ll+" "+rr+":"+max);}private static int getNum(Integer[] nums,int l,int r) {int height = 0;int min = Math.min(nums[l], nums[r]);for (int i = l+1; i <= r-1; i++) {if(nums[i]<min){height+=min-nums[i];}else{return -1;}}return height;}
}