• [LeetCode] 1762. Buildings With an Ocean View


    There are n buildings in a line. You are given an integer array heights of size n that represents the heights of the buildings in the line.

    The ocean is to the right of the buildings. A building has an ocean view if the building can see the ocean without obstructions. Formally, a building has an ocean view if all the buildings to its right have a smaller height.

    Return a list of indices (0-indexed) of buildings that have an ocean view, sorted in increasing order.

    Example 1:

    Input: heights = [4,2,3,1]
    Output: [0,2,3]
    Explanation: Building 1 (0-indexed) does not have an ocean view because building 2 is taller.
    

    Example 2:

    Input: heights = [4,3,2,1]
    Output: [0,1,2,3]
    Explanation: All the buildings have an ocean view.

    Example 3:

    Input: heights = [1,3,2,4]
    Output: [3]
    Explanation: Only building 3 has an ocean view.

    Example 4:

    Input: heights = [2,2,2,2]
    Output: [3]
    Explanation: Buildings cannot see the ocean if there are buildings of the same height to its right.

    Constraints:

    • 1 <= heights.length <= 105
    • 1 <= heights[i] <= 109

    我这里提供两种思路,一是贪心,二是单调栈。

    因为海是在数组的右边,数组最后一个元素是没有被挡住的,所以它有oceanview。照着这个思路,我们从数组的最右边开始往左扫描,如果遇到更高的楼,那么这个更高的楼就是有oceanview的;反之则是没有。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int[] findBuildings(int[] heights) {
     3         int max = 0;
     4         List<Integer> list = new ArrayList<>();
     5         for (int i = heights.length - 1; i >= 0; i--) {
     6             if (heights[i] > max) {
     7                 list.add(i);
     8                 max = heights[i];
     9             }
    10         }
    11 
    12         int[] res = new int[list.size()];
    13         Collections.reverse(list);
    14         for (int i = 0; i < res.length; i++) {
    15             res[i] = list.get(i);
    16         }
    17         return res;
    18     }
    19 }

    单调栈其实也是类似的思路,但是单调栈可以让我们从左往右遍历input数组。我们这里做的是一个单调递增的栈。

    时间O(n)

    空间O(n)

    Java实现

     1 class Solution {
     2     public int[] findBuildings(int[] heights) {
     3         Deque<Integer> stack = new ArrayDeque<>();
     4         for (int i = 0; i < heights.length; i++) {
     5             while (!stack.isEmpty() && heights[stack.peekLast()] <= heights[i]) {
     6                 stack.pollLast();
     7             }
     8             stack.addLast(i);
     9         }
    10         int n = stack.size();
    11         int[] res = new int[n];
    12         while (!stack.isEmpty()) {
    13             res[--n] = stack.pollLast();
    14         }
    15         return res;
    16     }
    17 }

    LeetCode 题目总结

  • 相关阅读:
    java---随机点名
    java实现窗体JFrame加载动态图片
    微信小程序--登陆页面
    java基础--随机数 猜数字游戏
    jQuery表单验证
    js获取Id,标签,类的几种选择器封装
    轮播图
    关于mysql安全
    PHP5.4开启zend opcache缓存
    ccs3中icon转换为字体的方法
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14454589.html
Copyright © 2020-2023  润新知