力扣学习day10

学习目录

  • 1.学习目标
  • 2.每日一题
    • 2.1题目
    • 2.2思考
      • 2.2.1滑动数组
    • 2.3代码
  • 3.哈希表
    • 3.1题目
    • 3.2思考
    • 3.3代码
  • 4.闲聊

1.学习目标

1.按照如下类型来刷题:数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
2.动手用多种语言来进行写题,并要有自己的代码模板。
3.总结程序员简历技巧。

学习网址


2.每日一题

1052. 爱生气的书店老板

2.1题目

今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。

在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。

书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。

请你返回这一天营业下来,最多有多少客户能够感到满意的数量。

2.2思考

这道题看起来很麻烦,实际理解起来很简单的。用游戏的方式来理解,这个书店老板不做人了,有超能力,可以放大招。大招时间无敌,但是时间只持续Xmin。每分钟会随机出现名为“客户”的怪物,老板平A有真空期,具体数值看grumpy,一旦“生气”就无法消灭“客户”,求老板在手握大招的时候最多可以消灭多少“客户”。

注意:.大招持续时间X,开始的时候我没注意到连续,写的代码和实际输出差别很大。

2.2.1滑动数组

这题就是个滑动数组的变型,可以将这题理解成对数组求最大的连续数组,连续数组长度为X,这个在前面做过类似的题目。有点区别的是,这个数组的数值不是customs[i],也不是grumpy[i],而是customs[i] * rumpy[i]。
力扣学习day10_第1张图片

2.3代码

/* 1052 爱生气的书店老板 */
int maxSatisfied(int* customers, int customersSize, int* grumpy, int grumpySize, int X){
     
    int i;
    int sum = 0;
    int res = 0;

    /* 窗口[0,X-1]内顾客都满意 */
    for (i = 0; i < X; i++) {
     
        sum += customers[i];
    }
    /* 统计[0,X-1]窗口外的顾客满意人数 */
    for (; i < customersSize; i++) {
     
        sum += (grumpy[i] == 0) ? customers[i] : 0;
    }
    res = sum;
    /* 滑动窗口, 每次进一人出一人, 计算满意人数 */
    for (i = 1; i <= customersSize - X; i++) {
     
        sum -= customers[i - 1]     * grumpy[i - 1];     /* 原窗口内生气的要减去     */
        sum += customers[i - 1 + X] * grumpy[i - 1 + X]; /* 新进窗口的, 生气的要加上 */
        res  = fmax(res, sum);
    }
    return res;
}

3.哈希表

终于到哈希表了,感觉算是重点吧!!

242. 有效的字母异位词

3.1题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

3.2思考

貌似这种题完全可以打表实现,复杂度为O(n)。遇到这种字符打表的,感觉都是一个套路,今天面试的时候也遇上了这么一个题目,可惜我没听懂题意。

然后测试哈希表的效果,果然打表速度就是无敌,如果面试官暗示你复杂度为O(n),那大概率就是打表了。

力扣学习day10_第2张图片

3.3代码

class Solution {
     
public:
    bool isAnagram(string s, string t) {
     
        int record[26] = {
     0};
        for (int i = 0; i < s.size(); i++) {
     
            // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[s[i] - 'a']++;
        }
        for (int i = 0; i < t.size(); i++) {
     
            record[t[i] - 'a']--;
        }
        for (int i = 0; i < 26; i++) {
     
            if (record[i] != 0) {
     
                // record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
};

4.闲聊

今天面试了一波,海投了下简历,感觉有点累了。本来计划今天还要写毕设的,看来是没时间了,呜呜呜!!!!

你可能感兴趣的:(力扣学习,leetcode)