zoukankan      html  css  js  c++  java
  • [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多线程性能优化
    It is indirectly referenced from required .class files
    Switch基本知识
    HibernateTemplate 查询
    Hibernate工作原理及为什么要用?
    深入Java集合学习系列:HashMap的实现原理
    sql查询语句中的乱码 -- 前面加N
    Windows 8.1内置微软五笔输入法
    the rendering library is more recent than your version of android studio
    JBoss vs. Tomcat
  • 原文地址:https://www.cnblogs.com/cnoodle/p/14454589.html
Copyright © 2011-2022 走看看