Monday, October 2, 2023

Leetcode 799. Champagne Tower

这道题的思路就是建一个二维dp[i][j],代表i行j列接到的所有的水,同时这个杯子溢出来的水(dp[i][j]-1)会有一半分别灌入杯子[i][j]和[i][j+1]。最后[i][j]杯子里的水就是1(杯子灌满)或者dp[i][j](所有接到的水)的较小值。
 
时间复杂度 O(n^2),n代表行数
 空间复杂度 O(n^2) 


class Solution {
public:
    double champagneTower(int poured, int query_row, int query_glass) {
        vector<vector<double>> received(101, vector<double>(101, 0));

        received[0][0] = poured;
        for (int i=0; i<received.size()-1; i++) {
            for (int j=0; j<=i; j++) {
                double overflow = (received[i][j] - 1)/2;

                if (overflow > 0){
                    received[i+1][j] += overflow;
                    received[i+1][j+1] += overflow;
                }
            }
        }

        return min(1.0, received[query_row][query_glass]);
    }
};

No comments:

Post a Comment

Leetcode 316. Remove Duplicate Letters

 这道题表面问的是如何删除重复,实际在问如何从多个字符选取一个保留,从而让整个字符串按升序排列。那么策略就是对于高顺位的字符比如‘a',就要选靠前位置的保留,而低顺位字符如’z'则应该尽量选取靠后位置保留。 算法大概思路:每看到一个字符,我们要决定是否保留 1. ...