leetcode刷题记录-day12

leetcode刷题记录-day12

  • 300
  • 304
  • 307
  • 309
  • 318
  • 319
  • 322
  • 323
  • 324
  • 325
  • 328
  • 331
  • 332
  • 333
  • 334

300

leetcode刷题记录-day12_第1张图片
1.这道题说实话有点爆炸,考察的频率特别特别高!!!(字节跳动17+)
2.我首先就想到了dp,这样一来,时间复杂度就成了O(n2),满足了题目的初始要求。
3.在进阶要求中,时间复杂度要进一步降低,所以咱们还得继续思考。用的方法是贪心+二分查找。首先维护一个d[i]数组和一个lengthMax元素,然后遍历nums数组,遇到比d[lengthMax]大的就直接添加到末尾同时更新lengthMax;遇到小的,就二分查找之前的一个刚刚比他大的元素然后将其替换,lengthMax不变(细品)

304

leetcode刷题记录-day12_第2张图片
1.考察次数不是很多,题目也比较简单,就简单dp就完事儿了

307

leetcode刷题记录-day12_第3张图片
1.考察次数也不多,解法的话首先我想到了维护一个前缀和数组,后面更新nums元素的时候同步更新这个前缀数组和即可。

309

leetcode刷题记录-day12_第4张图片
1.字节跳动考察次数居然有23+!!!
2.简单的思路就是dp维护一个一维数组,dp[i]表达的是第i天能获得的最大收益。显然这个算法是O(n2)的复杂度,僵硬。
3.好一点的做法是:维护一个状态机+dp。(主要是有三种状态,分别是持有,不持有,冷冻)

public class Solution {

    public int maxProfit(int[] prices) {
        int len = prices.length;
        // 特判
        if (len < 2) {
            return 0;
        }

        int[][] dp = new int[len][3];

        // 初始化
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        dp[0][2] = 0;

        for (int i = 1; i < len; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][2] - prices[i]);
            dp[i][2] = dp[i - 1][0];
        }
        return Math.max(dp[len - 1][0], dp[len - 1][2]);
    }
}

4.咱们推断一下,如果将冷冻期这个东西去掉,那么是否还可以用这个方法呢?答案是可以,且时间复杂度会同样很低,O(n)简直完美!!!
5.这道题我要吹爆!!!

318

leetcode刷题记录-day12_第5张图片
1.这道题考察的次数就很少了,太惨了
2.很显然,对于每个字符串而言,重要的信息是“某个字符是否出现过”,于是咱们就可以用bit进行压缩编码,如第0bit表示字符a是否出现过.
3.放心,总的时间复杂度还是O(n2)。

319

leetcode刷题记录-day12_第6张图片
1.大厂考察的确实比较少。
2.这道题我在题解里发现了有趣的解法(答案是sqrt(n)),当然我没有人家那种强劲的数学证明能力,所以我按照我自己的思路来。
3.其实就是考察index+1能否被1~n整除,如果可以的话,就记录一下次数,这就是翻转的次数,其实也就可以直接判断亮灭了,easy。

322

leetcode刷题记录-day12_第7张图片
1.考察次数爆炸!!!
2.这就是个完全背包问题,简单啊,先转化成0-1背包,然后再dp即可。dp的时候,记得,每次dp的是一个零钱种类。每次选择不要、要1个、要两个。。。
3.建议复习时再过一遍。

323

leetcode刷题记录-day12_第8张图片
1.考察次数不是很多。
2.思路比较简单,用的方法是bfs(就像是朋友圈的个数一样,根本就没啥区别好吧,弱爆了)

324

leetcode刷题记录-day12_第9张图片
1.考察次数不是很多。
2.这道题是前面那道题的变种,前面那道题非常简单,交换就完事儿了,但是这道题不允许相等。
3.难度说实话还是有点高的,做法是中位数+穿插。(考虑重复)

325

leetcode刷题记录-day12_第10张图片
1.这道题不就是微软面试的题目变简单点么!!!卧槽!!!终于刷到熟悉的题目了!!!
2.难受啊,人家要求O(n)的时间复杂度,怪不得,怪不得。
3.和之前的做法一样,维护一个前缀和数组,然后放到map中,其中map的first是前缀和,second是截止index,妙啊。
4.这道题要重点查看!

328

leetcode刷题记录-day12_第11张图片
1.字节跳动和微软都考察过这道题,感觉难度不大。
2.太简单了,直接就1-》3,2-》4,循环下去就完事儿了,弱爆了。

331

leetcode刷题记录-day12_第12张图片
1.考察次数很少了,不过题目还是很清晰的,可做。
2.提示一下,槽位。(这道题真的很棒!!!)

332

leetcode刷题记录-day12_第13张图片
1.考察次数还是很多的。
2.题目很简单,就dfs完事儿了。

333

leetcode刷题记录-day12_第14张图片
1.考察次数还是很多的,微软4+
2.思路很简单,就盲目dfs就完事儿了。

334

leetcode刷题记录-day12_第15张图片
1.考察次数不多,感觉这道题就挺简单的。直接贪心算法就完事儿了,pass。

你可能感兴趣的:(算法与数据结构)