力扣双周赛第57期

155 阅读2分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

1941. 检查是否所有字符出现次数相同

截屏2021-08-11 下午10.59.10.png

思路分析

力扣第一题,单次循环,用数组计数,得出答案

代码

bool areOccurrencesEqual(string s) {
        int arr[26];
        for(int i = 0; i < 26; i++){
            arr[i] = 0;
        }
        for(int i =0 ; i < s.size(); i++){
            arr[s[i] - 'a']++;
        }
        int tmp = 0;
        for(int i = 0; i < 26; i++){
            if(arr[i] != 0){
                if(tmp != 0){
                    if (tmp != arr[i])return false;
                }else{
                    tmp = arr[i];
                }
            }
        }
        return true;
    }

1944. 队列中可以看到的人数

截屏2021-08-11 下午11.04.02.png

思路分析

这道题可以看得出n2n^2可以很容易的解决问题,但是作为第四题,必然是需要剪枝的。我们可以看到数据的条件也验证了我们的观点。

  • n == heights.length
  • 1 <= n <= 105
  • 1 <= heights[i] <= 105
  • heights 中所有数 互不相同

大多数剪枝我们都会使用二分查找法尝试一下,小概率动态规划,但是这道题不断地在跟我们强调一个单调的概念。以heights[0]为例子他能看到一个点是因为heights[1],heights[2],heights[3]单调递增。

我们很快尝试使用单调栈,但却发现无从下手,因为无论是维护一个递增还是递减的栈对我们都没有较大的用处。

不妨继续看题,首先,answer[i] **是第 i 个人在他右侧队列中能 看到 的 人数 。那么我们就需要遍历到第i个点之前,遍历到所有他的右侧节点,换句话说我们需要逆向遍历。

关于是递增的单调栈还是递减的单调栈我们也仅仅是需要通过模拟一次就知道了答案,比方说对于heights[1],选择了递减,此时单调栈中包含heights[2],heights[4]。而如果选择了递增,单调栈包含heights[2],height[3].

因此这道题就得到了答案。