力扣每日一题 2021/11

2021-11-01
11/1 分糖果

难度 EASY

我用了模拟的方法,答案提供了一种更加简洁的贪心算法:一共n个糖果,假设有m种,吃n/2个,如果m比n/2小,那么一定可以选m种,否则最多选n/2种,所以返回二者中更小的即可。

11/2 删除链表中的节点

难度 EASY

简单题,不说了。

11/3 接雨水 II

难度 HARD

1就很难,到了2还是很难。题解用了木桶理论,即接到的雨水的高度由这个容器周围最短的木板来确定的,所以利用最小堆,每次从“最外层”中找出最小的,根据他确定一个新的格子能接多少水,再把这个更新为“最外层”。

11/4 有效的完全平方数

难度 EASY

一开始想着自己写一个sqrt来算,但是网上找到的高效sqrt算法是有一定的误差度(误差0.06%),对于大数会有一定概率出错。不过搜的过程中找到一个名为“牛顿迭代法”的方法,可以相对比较快捷地解决问题。

11/5 最长定差子序列

难度 MEDI

本题我的做法是,用一个int-vector的哈希表记录每种元素在哪些地方出现过,然后从后往前遍历,一边将元素记入哈希表一边看当前位置+diff处的元素是否已经出现过,如果是,那么就可能能够更新子序列长度,又因为元素可以重复,所以需要遍历完这个哈希value。我这样的做法并不好,如果用从前往后遍历的话,哈希表只用记第一个元素即可(贪心的思想,选第一个是最不差的选择)。

11/6 丢失的数字

难度 EASY

因为只丢了一个,所以统计和与未丢情况,求差即可。

11/7 范围求和 II

难度 EASY

横向加过的最小值与纵向加过的最小值构成的矩阵的元素个数即是答案。

11/8 数字游戏

难度 MEDI

xAyB是典中典游戏了,这题并不需要完成猜,而是输出给予的提示,所以是模拟题,不难,比较繁琐而已。

11/9 祖玛游戏

难度 HARD

这题也太难了,由于可以消也可以不消,我能想到可以BFS或者记忆化搜索,但是不知道怎么写,只好CV了。有空的时候记得学习一下代码(其实有空,只是懒而已)。

11/10 提莫攻击

难度 EASY

简单题,模拟一下就行。

11/11 K个逆序对数组

难度 HARD

这道题我能想到用dp:设 f[i][j] 表示使用数字 1, 2, ⋯ ,i 的有 j 个逆序对的排列,当选取 i + 1个数字时,就涉及到第 i + 1个放在哪,在它后面的都与它构成逆序对,在它前面的都不构成,从而得到状态转移方程,但是这样的方程是时间超限的(计算方程要O(n)复杂度),这时候要用高中知识优化,用 f[i][j] 的方程与 f[i][j - 1] 的相减,将复杂度优化.

11/12 猜数字大小 II

难度 MEDI

起初我是贪心的想法,认为猜 left 到 right中的位置mid,使得 left 到 mid 的值与 mid + 1到 right的值最接近就是最优情况。然而我忽略了int并不连续,这样的猜法在很多时候都不准确,比如1到6,用这个方法应该猜4(1到4是10,5和6是11),然而实际上猜3更划算,因为剩下的456只需要猜一次就行,实际上和56等价。如果继续使用贪心会使得式子变得非常复杂,需要考虑奇偶和很多特殊情况。

题解给的做法非常简单,就是 dp[i][j] 表示从 i 到 j 的情况,循环时,最外层是数组长度 step,第二层是起始位置 i ,每次求得 dp[i][i + step] (循环假设猜数组中的每一个元素,将其分为两个更小的子问题)。

11/13 检测大写字母

难度 EASY

简单题。

11/14 键值映射

难度 MEDI

字母树 + 哈希表,哈希表记录key是否被记录,且拥有value。每次插入时,如果key存在,在字母树中执行插入[key, val - 原来的val],否则执行插入[key, val],字母树为每层加上值(而不是更新)。

11/15 灯泡开关

难度 MEDI

我写了几个,归纳得出答案应该是floor(sqrt(n)),因为只有完全平方数对应编号最终会亮,题解给出了证明。

11/16 完美矩形

难度 HARD

我一开始的想法是用map记录,然后每次看能不能融合两个矩形合成更大的,然后还需要对每个矩形进行排序,后来想到,其实只要记录出现过的四个顶点,计算面积是否与每个小矩形面积之和相等即可。但是这个还不够完善,因为会有重叠的情况。不存在重叠的情况是:四个顶点仅出现一次,其余顶点出现2或4次(重叠会导致一些点与其他点没有对上,即出现奇数次),那么用一个哈希记录这样的情况即可。

11/17 最大单词长度乘积

难度 MEDI

用一个int的低26位记录每个单词有哪些字母出现,记为mask。仅当两个mask与后值为0才不含有公共字母,遍历即可。

11/18 二叉树的坡度

难度 EASY

dfs就行。

11/19 整数替换

难度 MEDI

一个数字有如下几种情况:

  1. 偶数,只能变为一半
  2. 奇数
    1. 4k + 1型,用n - 1替换
    2. 4k + 3型,用n + 1替换,特殊情况是3,不会变成4而是变成2。
11/20 最长和谐子序列

难度 EASY

哈希表记下每个数字出现多少次,然后遍历哈希表看相邻元素有无出现过。

11/21 N 叉树的最大深度

难度 EASY

dfs。

11/22 打乱数组

难度 MEDI

这道题学到了c++11的随机数方法,然而好像效率很低,时间空间击败的都很少。

需要注意的是,每次打乱时,第i个元素是与之后的元素随机挑一个进行交换,这样是原地的,不会带来新的空间复杂度。

11/23 亲密字符串

难度 EASY

  1. 字符串长度不同,false
  2. 字符串完全相同,只有在有重复元素的情况下才会true(交换两个重复元素)。
  3. 仅两处不同,且交换后相同
11/24 从英文中重建数字

难度 MEDI

画个图统计一下词频就行,脑筋急转弯。

11/25 可怜的小猪

难度 HARD

如果这题从思考怎么做的角度来考虑就会十分复杂,但是这道经典的题目也有经典的信息论解法:

首先,最有解法必然是测试minutesToTest / minutesToDie轮,记为n。那么,每个小猪的状态就有第1轮死、第2轮死、……第n轮死、不死共n+1种;毒药在每个桶中机会均等,故状态共buckets桶。根据信息论,小猪状态需要log(n + 1)的信息量,毒药状态需要log(buckets)的信息量,那么,log(buckets)/log(n + 1)向上取整这个次数就可以做到(不需要管是怎么做的,信息论指出一定会有这么一种方法)。

11/26 二叉搜索树中的搜索

难度 EASY

简单题。

11/27 随机翻转矩阵

难度 MEDI

抄了题解中的一个方法,用递减的cnt来生成0到cnt的随机数,用map记录这个元素实际应该对应的原矩阵中的位置,从而达到每次生成随机数的时候不需要考虑哪些位置已经被生成。

11/28 找到字符串中所有字母异位词

难度 MEDI

滑动窗口解决问题。用diff记录不同字母的种类数(由于只需要记录相同的情况,所以不要在意有多少个而只要在意有多少种,一定程度上简化问题)。

11/29 第 K 个最小的素数分数

难度 HARD

用优先队列,首先记录下arr[0]到arr[n-1] / arr[n],然后每次弹出最小的arr[i]/arr[j],再把arr[i + 1] / arr[j] 加入优先队列(如果i + 1 < j),这样执行k次就得到了结果。

11/30 第 N 位数字

难度 MEDI

数学计算一下,得到n所在的数字应该是多少位,找到n对应哪个数,转成string返回具体哪一位。

本文阅读量: