列表

详情


1762. 能看到海景的建筑物

n 座建筑物。给你一个大小为 n 的整数数组 heights 表示每一个建筑物的高度。

建筑物的右边是海洋。如果建筑物可以无障碍地看到海洋,则建筑物能看到海景。确切地说,如果一座建筑物右边的所有建筑都比它 时,就认为它能看到海景。

返回能看到海景建筑物的下标列表(下标 0 开始 ),并按升序排列。

 

示例 1:

输入:heights = [4,2,3,1]
输出:[0,2,3]
解释:1 号建筑物看不到海景,因为 2 号建筑物比它高

示例 2:

输入:heights = [4,3,2,1]
输出:[0,1,2,3]
解释:所有的建筑物都能看到海景。

示例 3:

输入:heights = [1,3,2,4]
输出:[3]
解释:只有 3 号建筑物能看到海景。

示例 4:

输入:heights = [2,2,2,2]
输出:[3]
解释:如果建筑物右边有相同高度的建筑物则无法看到海景。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> findBuildings(vector<int>& heights) { } };

golang 解法, 执行用时: 132 ms, 内存消耗: 16 MB, 提交时间: 2023-10-17 18:00:13

// 单调栈
func findBuildings(heights []int) []int {
    stack := make([][]int,0)
    for i:=0;i<len(heights);i++{
        for len(stack)>0 && heights[i]>=stack[len(stack)-1][0]{
            stack = stack[:len(stack)-1]
        }
        stack = append(stack,[]int{heights[i],i})
    }
    res := make([]int,0)
    for i:=0;i<len(stack);i++{
        res = append(res,stack[i][1])
    }
    return res
}

golang 解法, 执行用时: 112 ms, 内存消耗: 9.2 MB, 提交时间: 2023-10-17 17:59:28

func findBuildings(heights []int) []int {
    n := len(heights)
    ans := []int{n-1}
        
    tmp := heights[n-1]
    for i := n - 2; i > -1; i-- {
        if heights[i] > tmp {
            ans = append(ans, i)
            tmp = heights[i]
        }
    }
    sort.Ints(ans)
    return ans
}

python3 解法, 执行用时: 80 ms, 内存消耗: 28.9 MB, 提交时间: 2023-10-17 17:56:36

class Solution:
    def findBuildings(self, heights: List[int]) -> List[int]:
        '''
        能看到海景,则其比之后的数字都大
        从右往左遍历
        '''
        n = len(heights)
        ans = [n-1] # 最右建筑一定能看到
        
        tmp = heights[n-1] # tmp记录最大值
        for i in range(n-2, -1, -1):
            if heights[i] > tmp:
                ans.append(i)
                tmp = heights[i]
        return ans[::-1]

上一题