LeetCode
假坏
JUST DO IT
展开
-
278 First Bad Version
First Bad VersionYou are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is dev原创 2015-09-09 12:18:53 · 585 阅读 · 0 评论 -
1 Two Sum
题意:给定一个数组nums和一个数target,在nums中找出和等于target的两个数,并返回两者的下标(下标从1开始)。分析:1)用两个for循环暴力两两匹配,复杂度为O(n^2),超时。 2)利用一个unordered_map或者map储存每个数和数的下标,对于每一个数nums[i]查找一次target-nums[i]是否存在,若找到返回两者在数组中的索引值+原创 2015-09-18 16:11:38 · 334 阅读 · 0 评论 -
3 Longest Substring Without Repeating Characters
题意:给出一字符串,求不出现重复字母的子串的最大长度,例如:"bbbbb",最长为1;"abcabcab",最长为3。分析:原创 2015-09-20 19:29:05 · 345 阅读 · 0 评论 -
4 Median of Two Sorted Arrays
题意:找出两个已排好序数组(合并之后形成新数组)的中位数,要求复杂度为O(log(m+n)),m,n分别为两数组长度。分析:首先想到的是先把两个数组合并,最暴力的方法就是合并之后再快排一次,复杂度O代码:原创 2015-09-21 22:30:39 · 309 阅读 · 0 评论 -
72 Edit Distance
题意:给出两个字符串word1、word2,现有三种操作insert delete replace每次操作只能修改一个字符,求通过这三种操作把word1转变成word2的最少次数。分析:动态规划。定义dp[i][j]表示word1的子串word1[0,i-1]转变成word2[0,j-1]的最小次数,动态转移方程为: dp[i][j原创 2015-09-22 10:57:57 · 345 阅读 · 0 评论 -
213 House Robber II
题意:在House Robber的基础上做了一点修改,给出的数不是一位数组而是组成了一个环。 分析:方法同House Robber。考虑组成环之后的数,选中第一个数,最后一个数就不能再选了,综合数组nums[0,n-2]和nums[2,n-1]选较大者则为问题答案。 代码:class Solution {public: int rob(vector<int>& nums) {原创 2015-09-23 17:45:04 · 458 阅读 · 0 评论 -
198 House Robber
题意:给定非负数的一维数组,从中选出不相邻的一组数,使这组数之和最大。分析:动态规划,设dp[i]表示nums[0,i]所选数组的最大和,状态转移方程为dp[i]=dp[i]=max(dp[i-1],dp[i-2]+nums[i]);代码:class Solution {public: int rob(vector& nums) { int ans=0;原创 2015-09-23 17:25:48 · 366 阅读 · 0 评论 -
124 Binary Tree Maximum Path Sum
题意:在一棵二叉树中,找出和最大的一条路径,路径的起点和终点可以为树的任意两个节点。 分析:自底向上更新节点的值,使得节点的值表示以该点为根往下扩展能形成的路径P(注意,不一定是根到节点的路径)的最大和Sum,由于是自底向上更新的,所以更新的同时可以动态更新以二叉树每个节点作为中转节点连接以该节点左右子节点为根已形成的路径的总最大和。 代码:/** * Definition for a bin原创 2015-09-23 20:02:07 · 631 阅读 · 0 评论 -
221 Maximal Square
题意:给出一个只包含0或1的二维矩阵,求矩阵中出现全为1的正方形的面积。 分析:动态规划。设dp[i][j]表示以matrix[i][j]为右下角的正方形的最大边长,转移方程为 代码:class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { int row=ma原创 2015-09-23 10:12:38 · 361 阅读 · 0 评论 -
273 Move Zeroes
题意:把一个数组中的0全部移到数组后面,不改变其他数的相对顺序 分析:从头开始遍历,遇到0则把0移到数组最后面,定义两个数分别记录数组前面得到的整数个数a和数组最后的0的个数b,当a+b==n(n为数组长度)时遍历结束。 代码:class Solution {public: void moveZeroes(vector<int>& nums) { int a,b;原创 2015-09-22 13:39:05 · 397 阅读 · 0 评论 -
Maximum Product of Word Lengths
class Solution {public: int maxProduct(vector& words) { int n=words.size(); vector dict(n,0); for(int i=0;i<n;++i){ for(char c:words[i]){ dict[原创 2015-12-16 12:15:32 · 510 阅读 · 0 评论 -
312 Burst Balloons
动态规划:dp[i][j]表示气球i到气球j的最佳coins 动态转移方程: dp[i][j]=max(dp[i][k-1]+nums[i-1]*nums[k]*nums[j+1]+dp[k+1][j]) k∈[i,j]class Solution {public: int maxCoins(vector<int>& nums) { for(int i=0;i<num原创 2015-12-01 15:41:38 · 2143 阅读 · 0 评论 -
16 3Sum Closest
class Solution {public: int threeSumClosest(vector<int>& nums, int target) { int n=nums.size(); int closest=nums[0]+nums[1]+nums[2]; sort(nums.begin(),nums.end());原创 2015-12-01 16:43:41 · 347 阅读 · 0 评论 -
15 3Sum
class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans; int n=nums.size(); if(n<3){ return ans; } sor原创 2015-12-01 16:33:28 · 381 阅读 · 0 评论 -
2 Add Two Numbers
题意:给出两个链表的头结点,将两链表每个节点的数相加,构成新的节点。分析:链表遍历。代码:(写得比较繁琐,但比较好懂)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),原创 2015-09-18 16:22:20 · 249 阅读 · 0 评论 -
222 Count Complete Tree Nodes
题意:求完全二叉树的节点个数。分析: 暴力枚举O(n)会超时。 首先,我们知道满二叉树的节点个数为2^h-1,其中h为树的高度; 其次,将完全二叉树都划分为左子树、根、右子树,由完全二叉树的定义可知,左右子树至少有一棵是满二叉树,于是总节点个数 countNodes(root) = 1+countNodes(root->left)+countNodes(root原创 2015-09-18 09:57:40 · 687 阅读 · 0 评论 -
151 Reverse Words in a String
题意:把一个句子中以空格隔开的单词分别反转分析:字符串操作。注意去掉首尾的空字符代码:class Solution {public: void reverseWords(string &s) { vector str; string t=""; while(s[0]==' '){ s.erase(0,1)原创 2015-09-17 23:42:13 · 539 阅读 · 0 评论 -
279 Perfect Squares
题意:定义perfect squares number 为(1,4,9,16,...) 给出一个正整数n,返回和为n的最小的perfect squares number 的数目。例如:n=12 ,返回3, 因为 12=4+4+4 ; n=13,返回2,因为13=4+9 。分析:动态规划,squares[i]表示i的最小perfect squares number,原创 2015-09-10 10:11:15 · 1766 阅读 · 0 评论 -
131 Palindrome Partitioning
题意:将字符串划分为回文子串序列,求所有的划分方式。分析:考虑将一个字符串划分为子串序列,共有2^(n-1)种不同划分(n为字符串长度),深搜,记录路径并判断每个子串是否为回文,复杂度为O(2^N)。代码:class Solution {public: vector> partition(string s) { vector> ans; vec原创 2015-09-10 20:15:30 · 288 阅读 · 0 评论 -
257 Binary Tree Paths
题意:给定二叉树,找出所有根到叶子的路径分析:dfs.代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(原创 2015-09-25 20:13:57 · 356 阅读 · 0 评论 -
98 Validate Binary Search Tree
题意:判断给出的二叉树是不是BST 分析:中序遍历并储存结点的值在一位数组中,如果数组是递增序列则二叉树为BST. 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeN原创 2015-09-25 20:21:48 · 336 阅读 · 0 评论 -
43 Multiply Strings
题意:给定两个整数num1、num2,计算两者乘积。分析:大数相乘。此题较为简单,不包含正负号、小数点等复杂的情况。代码:(1)普通大数乘法:原创 2015-09-11 10:47:13 · 350 阅读 · 0 评论 -
201 Bitwise AND of Numbers Range
题意:给定两个数m,n,求区间[M,N]上所有数的AND的结果。分析:由于区间[m,n]是连续的,由二进制数的特点,求该区间上所有数的AND结果相当于求m和n的都为1的共同前缀。代码:class Solution {public: int rangeBitwiseAnd(int m, int n) { int count=0; while(m!原创 2015-09-13 16:27:01 · 341 阅读 · 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),原创 2015-09-13 10:32:37 · 291 阅读 · 0 评论 -
56 Merge Intervals
题意:合并一系列有重合的区间。例如:Given [1,3],[2,6],[8,10],[15,18], return[1,6],[8,10],[15,18].分析:按start升序排列,再根据end合并。复杂度为O(nlogn).代码:/** * Definition for an interval. * struct Interval { * int star原创 2015-09-14 10:47:22 · 424 阅读 · 0 评论 -
9 Palindrome Number
题意:判断一个数是否是回文。分析:按照回文的定义进行判断,分别比较第一个和倒数一个数、第二个和倒数第二个数、以此类推。代码:class Solution {public: bool isPalindrome(int x) { if(x<0) return false; int count=1; while(x/count>=1原创 2015-09-14 09:46:34 · 270 阅读 · 0 评论 -
64 Minimum Path Sum
题意:给出一个mxn的非负二维数组,求从左上方到右下方所有路径中最小的和。分析:动态规划。dp[i][j]+=max(dp[i][+1j],dp[i+1][j])代码:int minPathSum(int **grid, int nRows, int nCols) { for(int i=nRows-2;i>=0;--i){ grid[i][nCols-1]+=原创 2015-09-15 09:13:02 · 697 阅读 · 0 评论 -
62 Unique Paths
题意:求在一个mxn的矩阵中,从左上方到达右上方的路径总数。分析:动态规划。dp[i][j]=dp[i-1][j]+dp[i][j-1];代码:class Solution {public: int uniquePaths(int m, int n) { int** dp=new int*[m]; for(int i=0;i<m;++i)原创 2015-09-15 09:16:53 · 491 阅读 · 0 评论 -
209 Minimum Size Subarray Sum
题意:求出总和大于s的最短子序列的长度。分析:两个指针start和end,end往后移并计算start到end之间的数之和sum,不断更新end-start最小值。代码:class Solution {public: int minSubArrayLen(int s, vector& nums) { int n=nums.size(); if(原创 2015-09-15 00:34:46 · 434 阅读 · 0 评论 -
257 Binary Tree Paths
题意:给定一棵树,求出所有根到叶子节点的路径。分析:DFS。(注意int到string的转换)代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(in原创 2015-09-16 09:46:46 · 312 阅读 · 0 评论 -
17 Letter Combinations of a Phone Number
class Solution {public: vector<string> letterCombinations(string digits) { vector<string> ans; if(digits==""){ return ans; } string combination="";原创 2015-12-01 16:55:47 · 436 阅读 · 0 评论