class Solution {
public:
vector<int> findBuildings(vector<int>& heights) {
}
};
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] 解释:如果建筑物右边有相同高度的建筑物则无法看到海景。
提示:
1 <= heights.length <= 105
1 <= heights[i] <= 109
原站题解
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]