今天定下的目标没有完成。跑完1000有些感冒的症状,身体不适。
在力扣上刷了几道题。
1.回顾了之前心血来潮刷的力扣的题目,也是在力扣上刷的第一题--两数之和。(时间线大概在一年前,当初坚持下来,我现在应该是个大佬了吧,可恶的三分钟热度。不想再重蹈覆辙了,无论多忙,每天争取刷几道练练手)当初用的方法是双层for循环暴力求解。过了之后也没有去想有没有更加好的思路,只是一味想把题过了,这是大忌。
看了官方题解,可以用哈希表来解决。只需要遍历一遍数组。把出现的每个数的下标存进哈希表里。
然后对于每个nums[i],判断target-i在不在哈希表即可,注意nums[i]不能重复使用
2.组合总数Ⅱ
这题和组合总数非常相似。但是每个数不可重复使用,并且不可有重复解。此问题关键在于如何去除重复解。
求所有可行解,我们仍然用回溯。首先要对candiates[]进行排序,这样我们才能在回溯过程中剪枝去重。
去重的思想类似于之前求三数之和,要进行剪枝(剪枝的前提是candidates有序)。参考第二个题解才写出来。去重操作:对于同层,只要保留第一次出现的数的分支,因为之后出现的相同的数的分支得出的结果是第一次出现的数的分支得出的结果的子集。
3、缺失的第一个正数。
这个题目暴力求解很好解。但是题目要求用O(n)时间复杂度,和常数级空间复杂度。这就有点棘手。看了官方题解,可以把数组做成哈希表。(官方题解思路真绝啊)
用负号来表示数存在。最后遍历数组,如果位置i的数>0,则i+1就是结果。
还有一种置换思路,将1-N的数移到它对应的位置,最后遍历数组,如果位置i的数不等于i+1,就是结果。
具体看官方题解。
总结:
什么时候我能不看题解解出题来啊!
还有我对哈希表适用哪些场景不是很熟悉,虽然知道哈希表能快速查找元素(O(1)时间复杂度)。
继续加油吧。尽量每天都刷题。