首页 > 试题广场 >

给定n个柱面的高度,表示降雨某地n块区域的海拔高度。 计算降

[问答题]
给定n个柱面的高度,表示降雨某地n块区域的海拔高度。
计算降雨之后该地最大储水面积。如果低于地平线,也就是小于0,则一定积水。
我理解的题目意思就是给个n代表将输入多少数,然后给n个数代表高度
发表于 2019-08-20 18:05:59 回复(0)
单调栈 leetcode 42题 接雨水 自己没用编辑器手写了一下 不确定对不对!!!!
//单调栈
public int maxArea(int[] heights){
    Stack<Integer> stack = new Stack<>();
    int result = 0;
    for(int i = 0 ;i < heights.length ; i ++){
        while(!stack.isEmpty() && heights[stack.peek()] <= heigths(i)){
            int curIndex = stack.pop();
            if(stack.isEmpty()) break;
            int rigthIndex = i;
            int leftIndex = stack.peek();
            int d = righhtIndex - leftIndex -1;
            int h = Math.min(heights[rightIndex],heights[leftIndex]) - heights[curIndex];
            result += d*h;
        }
        stack.push(i);
    }
     
    return result;
}


发表于 2019-08-11 23:25:55 回复(1)
题目没说清楚
发表于 2019-11-01 08:52:35 回复(0)
/**
	 * [1,3,5,2,6,0,9,10,8,2,7]
	 * 
	 * @param ary
	 * @return
	 */
	public static int caclPonding(int[] ary) {
		int maxIndex = findMaxIndex(ary);
		// 左右分开计算
		int sumLeft = caclLeftPonding(ary, 0, maxIndex);
		int sumRight = caclRightPonding(ary, maxIndex, ary.length - 1);
		return sumLeft + sumRight;
	}

	private static int caclLeftPonding(int[] ary, int startIndex, int endIndex) {
		if (startIndex == endIndex) {// 递归终止
			return 0;
		}
		int leftMaxIndex = findLeftMaxIndex(ary, startIndex, endIndex);
		int ponding = caclPonding(ary, leftMaxIndex, endIndex);
		return ponding + caclLeftPonding(ary, startIndex, leftMaxIndex);
	}

	private static int caclRightPonding(int[] ary, int startIndex, int endIndex) {
		if (startIndex == endIndex) {// 递归终止
			return 0;
		}
		int rightMaxIndex = findRightMaxIndex(ary, startIndex, endIndex);
		int ponding = caclPonding(ary, startIndex, rightMaxIndex);
		return ponding + caclRightPonding(ary, rightMaxIndex, endIndex);
	}

	private static int caclPonding(int[] ary, int startIndex, int endIndex) {
		if (endIndex - startIndex < 2) {
			return 0;
		}
		int width = endIndex - startIndex - 1;// 间隔数
		int height = ary[startIndex] > ary[endIndex] ? ary[endIndex] : ary[startIndex];// 取小值
		int sum = 0;
		// 内部实体面积
		for (int i = (startIndex + 1); i < endIndex; i++) {
			sum += ary[i];
		}
		return width * height - sum;
	}

	public static int findMaxIndex(int[] ary) {
		int maxIndex = 0;
		int max = ary[maxIndex];
		int length = ary.length;
		for (int i = 1; i < length; i++) {
			if (ary[i] > max) {
				max = ary[i];
				maxIndex = i;
			}
		}
		return maxIndex;
	}

	public static int findLeftMaxIndex(int[] ary, int startIndex, int endIndex) {
		int maxIndex = startIndex;
		int max = ary[maxIndex];
		for (int i = startIndex; i < endIndex; i++) {
			if (ary[i] >= max) {// 相等取最新的下标
				max = ary[i];
				maxIndex = i;
			}
		}
		return maxIndex;
	}

	public static int findRightMaxIndex(int[] ary, int startIndex, int endIndex) {
		int maxIndex = endIndex;
		int max = ary[maxIndex];
		for (int i = endIndex; i > startIndex; i--) {
			if (ary[i] >= max) {
				max = ary[i];
				maxIndex = i;
			}
		}
		return maxIndex;
	}

发表于 2020-02-13 20:14:33 回复(0)
地平面以哪个高度的柱面为准未交代
发表于 2019-11-17 01:16:20 回复(0)
public int solution(int[] arr){
    int sum =0;
    Stack<Integer> stack =new Stack<>();//栈里压的是坐标,用来计算长度
    for(int i =0;i<arr.length;i++){
        if(stack.size()==0) stack.push(i);
        else{
            if(arr[i]<arr[stack.peek()]) stack.push(i);
           else{
                int low =arr[stack.poll()];
                sum+=(i-stack.peek())*(Math.min(arr[i],arr[stack.poll()])-low);
                }
            
    }
    return sum;
}
发表于 2019-09-03 09:33:48 回复(0)
public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            int[] height = new int[n];
            for(int i=0;i<n;i++) {
                height[i] = sc.nextInt();
            }
            int lowest = Integer.MIN_VALUE;
            for(int i=0;i<n;i++) {
                lowest = Math.min(lowest, height[i]);
            }
            for(int i=0;i<n;i++) {
                height[i] += lowest;
            }
            LinkedList<Integer> stack = new LinkedList<>();
            int maxArea = 0;
            int sum =0;
            for(int i=0;i<height.length;i++) {
                while(!stack.isEmpty()&&height[stack.peekFirst()]<height[i]) {
                    int temp = stack.pollFirst();
                    if(stack.isEmpty())
                        break;
                    if(height[stack.peek()]==height[temp])
                        continue;
                    else {
                        int h = Math.min(height[i], height[stack.peek()]) - height[temp];
                        int distance = i - stack.peek() -1;
                        sum += h*distance;
                    }  
                }
                if(stack.isEmpty()||i==height.length-1) {
                    maxArea = Math.max(maxArea, sum);
                    sum = 0;
                }  
                stack.offerFirst(i);
            }
            System.out.println(maxArea);
    }
}
编辑于 2019-08-28 13:18:18 回复(0)
假定给了6块区域高度分别为1,1,2,2,3,3,用■表示,积水用〓表示,求〓的最大面积?题目大概意思是这样吧。 
│ 
│■〓〓〓〓■ 
│■■〓〓■■ 
│■■■■■■
编辑于 2019-08-18 00:25:24 回复(0)
没看懂题目什么意思

发表于 2019-08-13 15:52:43 回复(0)
题义不明
发表于 2019-08-08 15:46:25 回复(4)