Bootstrap

Leetcode 755 java题解 模拟 即可

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;
		    		    }
;