LeetCode Summary Search

来源:互联网 发布:萨德对中国的影响 知乎 编辑:程序博客网 时间:2024/06/10 17:52
=========================== Search ===================================


------------------------------ Backtracking  ----------------------------------------
找到所有子集
39. Combination Sum 40. Combination Sum II(给定一个集合,一个target,找到所有合为target的子集)
216. Combination Sum III(找到所有k个数和为n,k范围1~9)
排序,回溯
78. Subsets(找到所有子集)
90. Subsets II(有冗余)
排序,回溯

找到所有
17. Letter Combinations of a Phone Number(给出一串数字代表的所有字母)
设置数字对应的字母,回溯
22. Generate Parentheses(给定n对括号,生成所有合法的括号字符串)
S(Discuss): 两个变量分别控制左括号和右括号。left左括号可以用几个,right右括号可以用几个。
初值,left = n; right = 0; 
关键点:每当使用一个左括号时,left--,right++,为了保证合法性,每当使用一个左括号,才能用一个右括号。


分割
131. Palindrome Partitioning(分割串,使得每个部分都回文)
93. Restore IP Addresses(一串数,判断是否是IP)
Mine: 每次取1~3位,判断是否是0-255之间,然后剩下的串再继续递归,回溯


200. Number of Islands(矩阵元素1和0,1组成的是小岛,找到所有的小岛)
Mine: 朴素DFS


------------------------------------ BFS ------------------------------------------
矩阵找单词
79. Word Search(判断单词是否在矩阵中)
S1(Mine): BFS
首尾单词,字典,求变换路径
126. Word Ladder II(已知首尾单词,每次变一个字母,求路径)
容易超时:双向BFS
127. Word Ladder(字典,首位,变换一个,求路径)
朴素BFS
199. Binary Tree Right Side View(树,从右边看可以看到的结点)
Mine: 当BFS到新的层时,添加上次最后遍历的元素。
------------------------------------ DFS ---------------------------------------------
37. Sudoku Solver(解数独)
S(Discuss): 从左上角第一个开始填数,没填一个,check是否符合,符合了再下一个位置。记得回溯。
Discuss这个精简的程序非常赞。
113. Path Sum II(树,找到所有根到叶子和为sum的路径)
Mine: 朴素DFS
129. Sum Root to Leaf Numbers(树,找到所有根到叶子的总和)
Mine: 朴素DFS
Discuss: 非常精简的递归,完美!
if(root==NULL) return 0;
if (root->right==NULL && root->left==NULL) return s*10+root->val;
return sumNode(root->left,s*10+root->val)+sumNode(root->right,s*10+root->val);
257. Binary Tree Paths(树,返回所有根->叶子的路径)
Mine: general DFS
注意: 1. 只有根  2. 有负数
282. Expression Add Operators(字符串形式给一串数和一个数,找到添加+-*方式使得和为给定的数)
Mine:DFS,  dfs(string num,long long int target,long long int currentSum, long long int preVal,string currentExp)
每次尝试三种符号+-*分别去DFS
332. Reconstruct Itinerary(一堆飞机票包含起点终点信息,返回航行路线)
Mine: DFS

生成
386. Lexicographical Numbers(1-n按字典序排序)
Mine: 每次往后加一位

---------------------------------- BFS/DFS both fine -------------------------------------
133. Clone Graph(复制一个图)
要点:用hash标记边是否已经生成过map<  点 , 点   >标记边。
51. N-Queens(返回所有解)
52. N-Queens(返回解的个数)
queen[i]=j 表示第i行第j列有皇后
判重,经典搜索
116. Populating Next Right Pointers in Each Node(每个节点,指向右边的节点)
117. Populating Next Right Pointers in Each Node II
301. Remove Invalid Parentheses(删除掉多余的括号)
Mine: BFS,每次去掉一个符号,检验是否合法,很慢*5
-------------------------------- Binary Search ------------------------------------------
通过控制与mid的等号来确定边界以及是否找到
33. Search in Rotated Sorted Array 81. Search in Rotated Sorted Array II
被旋转的,至少有一半是有序的,对有序的这一半进行二分查找。
II:有冗余
S1(Mine):用了map标记是否出现过,很慢
S2(Discuss):
34. Search for a Range(在有序数列中,查找target的位置范围)
二分,控制mid的赋值,来保证返回范围的左边界。
35. Search Insert Position(找到target的位置,不在则找到应该在的位置)
287. Find the Duplicate Number(n+1个数,有一个是重复的,找到这个数)
S1(Mine): 暴力枚举,非常慢!
S2(Discuss): Bianry Search
定义一个countLess函数,计算某区间比mid小的个数。
当cnt<=mid时候,说明冗余在右边,否则冗余在左边,根据此情况调整二分的方向
S3(Discuss): Linked List cycle
使用两个指针,一个快,一个慢,相遇点就是冗余点
slow = nums[slow]; fast = nums[nums[fast]];
240. Search a 2D Matrix II(在2D矩阵查找)
278. First Bad Version




0 0
原创粉丝点击