leetcode
unity大话东游
一枚热爱游戏的程序猿,分享unity游戏开发哦~
展开
-
“一个数组有正负0,求和为0的最长连续子数组”的失败解法
问题:一个数组有正负0,求和为0的最长连续子数组失败思路:想半天没有想到什么优化巧妙的方法。最后思路是:对a[0]...a[i]进行累加求和,将原来的a[i]转换为sum_a[i]。初始化时i=-1,从后往前找出第一个sum_a[j]==0的j。正式处理时,从前往后i=0~len,从后往前j=len~i,然后找出第一个sum_a[j]==sum_a[i],判断此时的j-i是否大于原来的j-i,原创 2015-09-25 22:36:25 · 909 阅读 · 0 评论 -
76.Minimum Window Substring
问题:给出两个字符串,求第一个字符串中包含第二个字符串的最大子串。思路:建立两个hash表。第一个hash表存储第二个字符串中各个字符出现的次数。第二个hash表初始化跟第一个hash相同,只不过各个字符的value都等于0。然后遍历第一个字符串,只要当前字符出现在第一个hash表中,就将第二个hash的对应字符的value加1,直到第二个hash表中所有字符的value都大于等于第一个has原创 2015-08-08 21:16:35 · 463 阅读 · 0 评论 -
70.Climbing Stairs
问题:斐波那契数列问题思路:用递归的话有很多重复计算,时间、空间不行,有可能栈溢出。用动态规划很好的解决这些问题。class Solution {public: int climbStairs(int n) { int* dp=new int[n+1]; dp[1]=1; dp[2]=2; for(int原创 2015-08-08 22:24:21 · 314 阅读 · 0 评论 -
111.Minimum Depth of Binary Tree
思路:一开始以为这个题和104题的“Maximum Depth of Binary Tree”是一样,后来发现不是那么回事,存在理解上的错误。只有左右孩子都为空的节点才算是叶节点,所以当根节点只有左孩子而没有右孩子的时候,它的最小深度应该是2,而不是1。class Solution {public: int minDepth(TreeNode* root) {原创 2015-07-05 21:59:07 · 323 阅读 · 0 评论 -
104.Maximum Depth of Binary Tree
思路:求二叉树的深度,很简单。class Solution {public: int maxDepth(TreeNode* root) { if(root==NULL) return 0; return max(maxDepth(root->left),maxDepth(root->right))+1; }};原创 2015-07-05 21:42:47 · 251 阅读 · 0 评论 -
209.Minimum Size Subarray Sum
方法1:用双指针滑动窗口。这是一种双指针应用类型题。复杂度O(n)。class Solution {public: int minSubArrayLen(int s, vector& nums) { int len=nums.size(); if(len==0) return 0;原创 2015-07-03 18:00:59 · 296 阅读 · 0 评论 -
154.Find Minimum in Rotated Sorted Array II
思路:循环排序,二分法。注意存在相等值的情况。class Solution {public: int findMin(vector& nums) { int len=nums.size(); //判错 if(len if(len==1) return nums[0]; int left=0,原创 2015-07-03 15:28:57 · 291 阅读 · 0 评论 -
35.Search Insert Position
思路:典型的二分法。这里用的是递归写法。有空可以试下非递归的。class Solution {public: int solve(vector& nums,int low,int high,int target){ if(low>=high){ if(target>nums[low]) return原创 2015-07-02 19:58:07 · 295 阅读 · 0 评论 -
14.Longest Common Prefix
思路:直接明了。找出最短的字符串,然后跟第一个字符串比较,用比较得到的结果去跟第二个字符串比较。直到结束。时间复杂度O(mn),实际会好点class Solution {public: string longestCommonPrefix(vector& strs) { int nums=strs.size(); if(nums==0) ret原创 2015-06-12 12:51:26 · 272 阅读 · 0 评论 -
23.Merge K Sorted Lists
第一种方法:分治法。思路:有点类似于MergeSort的思路,就是分治法,不了解MergeSort的朋友,请参见归并排序-维基百科,是一个比较经典的O(nlogn)的排序算法,还是比较重要的。思路是先分成两个子任务,然后递归求子任务,最后回溯回来。这个题目也是这样,先把k个list分成两半,然后继续划分,直到剩下两个list就合并起来,合并时会用到Merge Two Sorted List原创 2015-06-29 20:48:23 · 394 阅读 · 0 评论 -
42.Trapping Rain Water
思路:这个算最大储水量的。用栈。找到第一个峰值入栈,然后往后遍历:“如果小于该峰值就入栈,直到当前值比峰值大,就可以开始出栈并同时计算储水”,然后更新峰值,继续重复这个操作直到vector遍历完。注意:如果最后是递减的,即最后一个vector元素不是峰值,那么就得特殊处理了。时间复杂度O(n)代码:class Solution {public: int trap(vector原创 2015-06-11 21:19:13 · 432 阅读 · 0 评论 -
53.Maximum Subarray
思路:三种方法:1.暴力遍历:两层循环,不必多说2.分治法:3.动态规划:现在对线性时间解法做一下解释,属于一种DP问题。已知了前k个元素的最大子序列和为maxSub(已经被记录下来了),以及一个临时和sum,如果添加了第k+1这个元素,由于是连续子序列这个限制,所以如果k+1这个元素之前的和是小于0的,那么对于增大k+1这个元素从而去组成最大子序列是没有贡献的,所以可以把sum原创 2015-06-28 23:54:01 · 249 阅读 · 0 评论 -
20.Valid Parentheses
思路:普通的栈class Solution {public: bool isValid(string s) { stack the_stack; for(int i=0;i if(s[i]=='('|| s[i]=='{'|| s[i]=='['){ the_stack.push(原创 2015-06-06 11:57:32 · 261 阅读 · 0 评论 -
242.Valid Anagram
问题:两个字符串,判断是不是通过改变字符位置得到对方。思路:建立hash表查找。一开始用unordered_multimap,key-value分别是“字符-字符是否出现”,但是超时了;后来变成用unordered_map,key-value分别是“字符-字符出现次数”,遍历完了如果hash表刚好被删除,就说明trueclass Solution {public: boo原创 2015-08-08 16:10:59 · 378 阅读 · 0 评论 -
136.Single Number
问题:给一个int数组,所有元素均出现2次除了其中一个只出现1次,找出该数。思路:建立hash表:遍历数组元素,如果发现hash中没有出现当前元素,就将当前元素插入hash表;如果hash表已经存在该元素,就将该元素删除。最后hash剩下的那个数就是只出现一次的数。class Solution {public: int singleNumber(vector& nums) {原创 2015-08-08 16:29:45 · 419 阅读 · 0 评论 -
链表分段翻转
问题: 将一个单链表每K个一组进行翻转1->2->3->4->5假如k=2,则变成2->1->4->3->5k=3,则变成3->2->1->4->5接口函数:ListNode*res(ListNode*head,intk)代码:ListNode*res(ListNode*head,intk){}#includeusin原创 2015-10-11 15:43:40 · 1092 阅读 · 0 评论 -
279.Perfect Squares
思路:动态规划。class Solution {public: int numSquares(int n) { //判错 if(n int *dp=new int[n]; //初始化 for(int i=0;i dp[i]=n;原创 2015-10-16 13:15:13 · 513 阅读 · 0 评论 -
leetcode题目
1.N sum问题都可以用外层循环+最后两层用前后指针的方法。N sum closest问题可以用外层循环+最后两层用杨氏矩阵的方法。另外,如果能转换成two sum,用hash table效果肯定不会差。2.皇后问题,电话键,都可以用回溯法=枚举+约束函数&越界函数,考虑是否是排列树或者子集树。3.word break问题,典型动态规划问题=划分状态+递推关系+起始条件。原创 2015-04-14 20:01:14 · 660 阅读 · 0 评论 -
107.Binary Tree Level Order Traversal II
问题:跟上道102题基本一样,只不过是要求从最下层开始遍历。思路:多用了一个栈,作为临时结果,最后再把栈的内容搬移到最终结果里即可。class Solution {public: vector> levelOrderBottom(TreeNode* root) { vector> res; if(root==NULL) return res原创 2015-08-02 16:00:46 · 350 阅读 · 0 评论 -
102.Binary Tree Level Order Traversal
问题:层次遍历二叉树,注意多了个要求:按层输出。思路:广度优先搜索BFS,用队列存储节点。另外为了满足按层输出的要求,需要用到两个辅助变量:cur_layer_num=0,next_layer_num=0;//当前层有多少个节点,下一层有多少个节点。每次出一个节点,当前层就减1,直到0,说明一层结束。每次进一个节点,下一层就加1,直到当前层减为0,下一层计算完毕。/** * Defin原创 2015-08-02 15:51:52 · 383 阅读 · 0 评论 -
100.Same Tree
思路:分治法,化简即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NUL原创 2015-08-01 21:07:42 · 257 阅读 · 0 评论 -
101.Symmetric Tree
判断是否是对称树,镜像树的。思路:先判断根节点,将其拆分成左右孩子节点两棵树。然后用深度优先搜索(其实跟回溯法没啥区别)判断这两棵树的对称位置是否一致即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tree原创 2015-08-02 11:49:21 · 418 阅读 · 0 评论 -
207.Course Schedule
问题:课程之间具有依赖性,比如必须先修某门课,然后才可以修另外的课程。给你一些课程,以及课程的依赖关系,求是否能够完成所有课程思路:这种题属于任务队列,先根据依赖关系建立邻接表数组,然后选出所有入度为0的课程入队,修完这些课,相应的依赖课程的入度减1,然后再继续将入度为0的课程入队,直到队列为空。此时判断:如果入队的课程数等于总的课程数,说明每一门课程都入队了,也就是说每门课的入度都降为0,所原创 2015-08-02 20:52:22 · 382 阅读 · 0 评论 -
112.Path Sum
问题:搜索二叉树,判断是否存在某个从根节点到叶节点的路径,该路径所有节点值之和为sum。思路:思路很简单:深度优先搜索(其实就是回溯法),当搜索到叶节点时做一次判断;如果某次判断为真,结束程序,返回真;除非搜索完了都没有为真,返回假。/** * Definition for a binary tree node. * struct TreeNode { * int va原创 2015-08-02 14:09:48 · 331 阅读 · 0 评论 -
24.Swap Nodes in Pairs
问题:给一个链表,每2个节点交换一次,比如,Given 1->2->3->4, you should return the list as2->1->4->3.思路:只考察链表操作,太简单。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListN原创 2015-08-23 22:28:28 · 360 阅读 · 0 评论 -
96.Unique Binary Search Trees
问题:给出n,请问这1,2...n个数,能构成多少种二叉排序树思路:动态规划。遍历1...n,i作为根节点,则根节点左边有f(i-1)种可能,右边有f(n-i)种可能,所以以i为根节点时有f(i-1)*f(n-i)种可能,循环即可。class Solution {public: int numTrees(int n) { if(n原创 2015-08-23 23:36:34 · 332 阅读 · 0 评论 -
64.Minimum Path Sum
问题:给一个矩阵,求一条从左上角到右下角的路径的和,该路径上的数的和最小。思路:很典型的动态规划问题。类似于数学归纳法。划分状态:dp[i][j]表示从坐标(i,j)到右下角的最小和。递推式:dp[i][j]=grid[i][j]+min(dp[i+1][j],dp[i][j+1])。注意边界条件即可。class Solution {public: int minPathSu原创 2015-08-08 22:55:40 · 326 阅读 · 0 评论 -
215.Kth Largest Element in an Array
思路:分治法,其实思路跟动态规划基本一样,只不过用递归的方式去解决问题。总结分治法的框架就是:solve函数(相当于动态规划的状态划分函数,这个比较关键,找到了,问题基本就解决了)+递归使用(相当于动态规划的递推关系)。本题的solve函数是一遍快排。class Solution {public: //递归的使用一遍快排,直到前面的的数刚好凑够k个。原创 2015-06-26 21:12:15 · 328 阅读 · 0 评论 -
169.Majority Element
思路:用几个额外变量,然后遍历一次就可找到。遍历到相同元素就加1,否则减1,遇到0就将当前的majority改成当前元素继续。class Solution {public: int majorityElement(vector& nums) { //init int len=nums.size(); if(len==0)原创 2015-06-25 16:48:27 · 333 阅读 · 0 评论 -
97.Interleaving String
思路:动态规划。dp[m][n]表示是s1[0~m-1]和s2[0~n-1]能否构成s3[0~m+n-1]。那么很显然,递推式是dp[m][n]=((dp[m-1][n]&&s1[m-1]==s3[m+n-1])||(dp[m][n-1]&&s2[n-1]==s3[m+n-1]))。边界条件是dp[0][1~n]和dp[1~m][0]。注意动态申请内存时的写法,而且空间是N1+1和N2+1原创 2015-05-19 00:10:53 · 497 阅读 · 0 评论 -
17.Letter Combinations of a Phone Number
Letter Combinations of a Phone Number Total Accepted: 34954 Total Submissions: 134310My SubmissionsQuestion Solution Given a digit string, return all possible letter combinations原创 2015-04-04 17:59:14 · 335 阅读 · 0 评论 -
15.3Sum
3Sum Total Accepted: 48978 Total Submissions: 290298My SubmissionsQuestion Solution Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Fin原创 2015-04-04 09:49:54 · 291 阅读 · 0 评论 -
16.3Sum Closest
3Sum Closest Total Accepted: 34116 Total Submissions: 126585My SubmissionsQuestion Solution Given an array S of n integers, find three integers in Ssuch that the sum is closest t原创 2015-04-04 09:52:51 · 252 阅读 · 0 评论 -
7.Reverse Integer
Reverse digits of an integer.Example1: x = 123, return 321Example2: x = -123, return -321click to show spoilers.Have you thought about this?Here are some good questions to ask before coding.原创 2015-03-19 21:42:00 · 329 阅读 · 0 评论 -
4.Median of Two Sorted Arrays
There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).Show TagsHave原创 2015-03-19 19:57:49 · 311 阅读 · 0 评论 -
9.Palindrome Number
Palindrome Number Total Accepted: 47612 Total Submissions: 162059My SubmissionsQuestion Solution Determine whether an integer is a palindrome. Do this without extra space.click原创 2015-03-22 14:12:26 · 287 阅读 · 0 评论 -
8.String to Integer (atoi)
String to Integer (atoi) Total Accepted: 40035 Total Submissions: 298259My SubmissionsQuestion Solution Implement atoi to convert a string to an integer.Hint: Carefully conside原创 2015-03-22 11:32:16 · 278 阅读 · 0 评论 -
6.ZigZag Conversion
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)P A H NA P L S I原创 2015-03-19 20:01:10 · 281 阅读 · 0 评论 -
11.Container With Most Water
Container With Most Water Total Accepted: 33299 Total Submissions: 104359My SubmissionsQuestion Solution Given n non-negative integers a1, a2, ..., an, where each represents a原创 2015-03-28 21:56:25 · 262 阅读 · 0 评论 -
12.Integer to Roman
Integer to Roman Total Accepted: 27813 Total Submissions: 80511My SubmissionsQuestion Solution Given an integer, convert it to a roman numeral.Input is guaranteed to be within原创 2015-03-28 22:56:02 · 381 阅读 · 0 评论