![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法:哈希表
拾牙慧者
会点c++、python;
展开
-
leetcode 47. 全排列 II 思考分析
题目给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。思考分析以及代码这一题和前面的做过的两个题目有所关联:leetcode 46. 全排列 思考分析再加上leetcode 491. 递增子序列 思考分析类似的去重操作。先画出解空间树的图:红色部分才是真正意义上的去重:值相同的跳过。蓝色部分指的是我们用过的元素不能再用了。在组合问题中由于for循环进入下一层是i+1,所以本身就将用过的元素排除了。然而在排列问题中,我们可能要用到序号靠前且没有使用过的元素,所以原创 2020-11-12 11:43:17 · 230 阅读 · 0 评论 -
leetcode 46. 全排列 思考分析
目录1、题目2、思考3、优化1、题目给定一个 没有重复 数字的序列,返回其所有可能的全排列。2、思考老规矩,先画出给出的例子的解空间树:观察我们可以发现:1、深度向下一层深入时,出现过的元素不能再出现,我们能选择的只有没有选择过的元素,此处我用的哈希法set。2、结束条件是:同一个树枝上的结点个数>=nums数组的size().于是可以得到初步代码:注意这里判断元素是否出现过我用的set,后面会有优化class Solution {public: vector<.原创 2020-11-11 11:09:12 · 264 阅读 · 0 评论 -
leetcode 491. 递增子序列 思考分析
题目给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。说明:给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。思考这一题和leetcode 90. 子集 II 思考分析的思想有点像。但是需要注意的是:1、该数组是求递增子序列,所以不能打乱原数组的顺序。2、递增子序列3、递增子序列的长度最少是2其它的思想:回溯、去重其实和leetcode 90. 子集 II 思考分析原创 2020-11-10 10:50:06 · 236 阅读 · 0 评论 -
LeetCode 454. 四数相加 II 思考分析
题目给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。思考这一题和LeetCode 18. 四数之和题目相似,但是本质不同。因为三数之和和四数之和这两道题目使用哈希法在不超时的情况下做到对结果原创 2020-11-06 14:42:40 · 270 阅读 · 0 评论 -
leetcode 383. 赎金信 思考分析
题目给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)思路思路和leetcode 242. 有效的字母异位词一样,这里不做过多分析。代码class Solution {public:原创 2020-11-06 14:09:57 · 217 阅读 · 0 评论 -
leetcode 1. 两数之和 思考分析
1、题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。2、思考分析双for循环的时间复杂度O(n^2),而哈希法的时间复杂度为O(1),所以哈希法显然更有效。这里我们使用map而不使用set、或者自构造数组。数组与set的局限:1、数组大小受到限制,如果元素较少,而哈希值太大会造成内存空间浪费2、set是一个集合,里面放的元素只能是一个原创 2020-11-06 11:35:09 · 106 阅读 · 0 评论 -
leetcode 202. 快乐数 思考分析(哈希集合与双指针解)
1、题目编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。思考分析对一个数不断进行get_sum操作,那么最终可能的结果有两种可能:1、得到12、计算的数陷入某种循环,然后会有重复的数出现如果得到1,直接返回true;如果检测到重复原创 2020-11-06 11:03:08 · 205 阅读 · 0 评论 -
leetcode 349. 两个数组的交集 思考分析
1、暴力双for循环class Solution {public: vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { vector<int> result; vector<int> res; if(nums1.size()==0 || nums2.size()==0) return resu原创 2020-11-04 17:38:50 · 157 阅读 · 0 评论 -
leetcode 242. 有效的字母异位词 思考分析
题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。我们先考虑低阶版本,认为字符只有26种可能,然后将a ~ z的字符映射到数组的索引0 ~ 25,数组中存放的则是该索引出现的频次。记录下s的频次和t的频次,然后比较是否相同,相同则是字母异位词(出现的字母种类一样多且每种出现的频次一样多)。这里为了节省空间我们选择直接在原数组上进行减法。代码:class Solution {public: int nums[26]; bool isAnagra原创 2020-11-02 22:42:23 · 186 阅读 · 0 评论