755. 倒水
给出一个地形高度图, heights[i] 表示该索引处的高度。每个索引的宽度为 1。在 V 个单位的水落在索引 K 处以后,每个索引位置有多少水?
水最先会在索引 K 处下降并且落在该索引位置的最高地形或水面之上。然后按如下方式流动:
如果液滴最终可以通过向左流动而下降,则向左流动。
否则,如果液滴最终可以通过向右流动而下降,则向右流动。
否则,在当前的位置上升。
这里,“最终下降” 的意思是液滴如果按此方向移动的话,最终可以下降到一个较低的水平。而且,“水平”的意思是当前列的地形的高度加上水的高度。
我们可以假定在数组两侧的边界外有无限高的地形。而且,不能有部分水在多于 1 个的网格块上均匀分布 - 每个单位的水必须要位于一个块中。
思路:V的数量很小只有2000,考虑暴力模拟即可
首先考虑能不能向左流 再考虑能不能向右流
需要注意流动过程中如果数列22225,从5开始流的话,式子会变成22235
而不是32225
public static void daoshui(int[] arr,int k) {
boolean neng =false;
boolean rneng=false;
for(int i=k-1;i>=1;i--) {
if(arr[i]<arr[i+1]) {
neng=true;
break;
}else if(arr[i]>arr[i+1]) {
break;
}
}
if(!neng) { // System.out.println(1);
for(int i=k+1;i<arr.length;i++) {
if(arr[i]<arr[i-1]) {
rneng=true;
break;
}else if(arr[i]>arr[i-1]) {
break;
}
}
}
//System.out.println(rneng);
if(!neng&&!rneng) {
arr[k]++;
}
if(neng) {
int q=-1;
for(int i=k-1;i>=1;i--) {
int count =-1;
if(arr[i]<arr[i-1]) {
count=i;
q=arr[count];
break;
}
}
for(int i=k-1;i>=1;i--) {
if(arr[i]==q) {
arr[i]++;
break;
}
}
}
if(!neng&&rneng) {int q=-1;
for(int i=k+1;i<arr.length-1;i++) {
int count=-1;
if(arr[i]<arr[i+1]) {
count =i;
q=arr[count];
break;
}
}
for(int i=k+1;i<arr.length-1;i++) {
if(arr[i]==q) {
arr[i]++;
break;
}
}
}
}
public int[] pourWater(int[] heights, int V, int K) {
int []arr=new int [heights.length+2];
for(int i=1;i<=heights.length;i++) {
arr[i]=heights[i-1];
}
arr[0]=99999;
arr[heights.length+1]=99999;
for(int i=0;i<V;i++) {
daoshui(arr,K+1);
// System.out.println(Arrays.toString(arr));
}for(int i=0;i<heights.length;i++) {
heights[i]=arr[i+1];
}
return heights;
}