Leetcode
jeanphorn
这个作者很懒,什么都没留下…
展开
-
leetcode 224 Basic Calculator
1. 问题描述 计算字符串表达式的值,表达式中只含有(,),+,-,空格和非负整数。例如: “1 + 1” = 2 ” 2-1 + 2 ” = 3 “(1+(4+5+2)-3)+(6+8)” = 23 原文链接:https://leetcode.com/problems/basic-calculator/2. 方法与思路2.1 利用后缀表达式计算 一种思路是按照常规的方法原创 2015-06-21 00:39:33 · 7643 阅读 · 2 评论 -
Leetcode 229 Majority Element II
1. 问题描述 在一个无序的整数数组nums[](大小为n)中,找出出现次数大于n/3的所有数。即找出数字numsinums_i的出现次数k,满足k>⌊n/3⌋k > \lfloor n/3\rfloor。 2. 方法与思路 首先,可以通过分析得到结论:满足条件的数字个数cnt最多为2。 证明: ifcnt>2⇒cnt× (⌊n/3⌋+1 )>nif cnt >2 \Rightarro原创 2015-07-06 21:56:26 · 4895 阅读 · 0 评论 -
Leetcode 232 Implement Queue using Stacks 和 231 Power of Two
1. 232 Implement Queue using Stacks1.1 问题描述 使用栈模拟实现队列。模拟实现如下操作: push(x). 将元素x放入队尾。pop(). 移除队首元素。peek(). 获取队首元素。empty(). 判断队列是否为空。注意:只能使用栈的标准操作,push,pop,size和empty函数。1.2 方法与思路 本题和用队列实现栈思路一样,设原创 2015-07-07 10:32:10 · 4997 阅读 · 0 评论 -
Leetcode 230 Kth Smallest Element in a BST
1. 问题描述 给定一个二叉搜索树,找出第k小的元素。注意:可以假设k总是存在,1≤k≤BST总元素数1 \le k \le BST总元素数。2. 方法与思路 根据二叉搜索树的特点,中序遍历的结果即是排序好的数组。那么找出第k小的数,只需要先进行一次中序遍历即可。 /** * Definition for a binary tree node. * struct TreeNode {原创 2015-07-07 10:49:56 · 5599 阅读 · 0 评论 -
Leetcode 234 Palindrome Linked List 复杂度为时间O(n) 和空间(1)解法
1. 问题描述 给定一个单链表,判断其内容是不是回文类型。例如1–>2–>3–>2–>1。时间和空间复杂都尽量低。2. 方法与思路 1)比较朴素的算法。 由于给定的数据结构是单链表,要访问链表的尾部元素,必须从头开始遍历。为了方便判断,我们可以申请一个辅助栈结构来存储链表的内容,第一次遍历将链表节点值依次入栈,第二次遍历比较判断是否为回文。 /** * Definition for原创 2015-07-14 12:35:38 · 3975 阅读 · 0 评论 -
leetcode 235 Lowest Common Ancestor of a Binary Search Tree
1. 问题描述 给定一棵二叉搜索树(BST),查找两个节点的最短公共祖先节点。 2. 方法与思路 这是一个简化的LCA问题,由于是二叉搜索树,树的本身就有一定节点,左儿子节点的值小于父节点值,父节点值小于右儿子节点的值。这样我们可以递归查找就可以了,如果当前节点值大于给定两个节点的值就去它的左子树查找,如果当前节点的值小于给定两个节点的值,就去它的右子树查找,否则返回该节点。 /**原创 2015-07-14 12:45:30 · 3174 阅读 · 0 评论 -
Leetcode 233 Number of Digit One
1. 问题描述 给定一个整数n,在所有不大于n的非负整数中,计算包含数字1的整数的个数。例如n=13n = 13的结果为6,包含1的数字有1,10,11,12,13。2. 方法与思路 这个问题最直观的方法就是累加1到n所有的包含1的数的个数。每个数通过循环取余10的方法判断是否包含1。但是这种思路效率并不高,数字n有lognlogn位,总得时间复杂度为O(nlogn)O(nlogn)。 利原创 2015-07-08 11:30:38 · 5301 阅读 · 0 评论 -
Leetcode 236 Lowest Common Ancestor of a Binary Tree
1. 问题描述 给定一棵二叉树和两个节点p、q,查找这两个节点最近的公共父节点。 2. 方法与思路 由于给定的是一颗普通的二叉树,与之前的二叉搜索树不一样,子树之间没有大小关系。但是可以用另一种思路,当前节点如果是p,q的公共最先节点,则p,q一定在当前节点的左右子树中。可以用递归解决。 /** * Definition for a binary tree node. * str原创 2015-07-15 16:03:46 · 2650 阅读 · 0 评论 -
Leetcode 238 Product of Array Except Self 时间O(n)和空间O(1)解法
1. 问题描述 给定一个n个整数的数组(n>1n>1)nums,返回一个数组output,其中的元素outputioutput_i的值为原数组nums中除numsinums_i之外的所有元素的积。例如:nums数组为[1,2,3,4],返回的output数组为[24,12,8,6]。 要求不用除法和时间复杂度为O(n). 2. 方法与思路 这道题如果没有除法的限制的话就很简单了,先求所原创 2015-07-16 11:15:37 · 3105 阅读 · 0 评论 -
Leetcode 239 Sliding Window Maximum
1. 问题描述 给定一个整数数组和一个大小为k的滑动窗口,滑动窗口每次从左到右移动一个数字,返回每次滑动窗口中的最大值。 2. 方法与思路 Method 1:最朴素的解法就是将窗口在数组上进行滑动,每滑动一次求一下窗口的最值。时间复杂度O(nk)O(nk)。 Method 2:还有就是使用平衡二叉树。 I. 取出数组前kk个元素,构建平衡二叉树。 II.原创 2015-07-19 13:26:03 · 3062 阅读 · 0 评论 -
Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)
1.问题描述 写一个高效的算法,从一个m×nm\times n的整数矩阵中查找出给定的值,矩阵具有如下特点: 每一行从左到右递增。每一列从上到下递增。2. 方法与思路2.1 二分查找法 根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键。实际上我们可以根据矩阵的第一列确定值可能所在的行的范围(limu,limd)(limu,limd),其中limu=0原创 2015-07-23 20:41:07 · 8843 阅读 · 2 评论 -
Leetcode 283 Move Zeroes
1. 问题描述 给定一个数组nums[],把数组中的所有0元素移动到非零元素的后面。例如,给定数组nums= [0, 1, 0, 3, 12], 完成移动后的数组为nums = [1, 3, 12, 0, 0]。要求不使用辅助数组,尽量少的操作。2. 方法与思路 思路一,在不改变非零元素的相对位置情况下移动0元素,可考虑冒泡排序的思路,将0元素冒泡至数组的右侧。 1)、从右往左遍历数组。原创 2015-10-06 16:45:22 · 1169 阅读 · 0 评论 -
Leetcode 215 Kth Largest Element in an Array
1. 问题描述 找出数组中第k大的数,注意:数组为无序数组。 2. 方法与思路 是一道经典算法题。解法也有好几种,一种是先进行排序,然后取出第k大的数;由于排序算法最快效率为O(nlogn)O(nlogn),所以整体效率为O(nlogn)O(nlogn)。二是使用优先队列,SLT中有优先队列的用法,内部是以堆的方式实现。时间效率也比较高,O(nlogn)O(nlogn)。 class原创 2015-06-28 18:29:56 · 5409 阅读 · 0 评论 -
Leetcode 216 Combination Sum III
1. 问题描述 找出所有k个数字的组合,使它们的和为n。设所有的数都为1~9,且没有重复数。结果要保持升序。 2. 方法与思路 采用回溯法可以很好地解决这个问题。 class Solution {public: int target,kk; vector<vector<int> > v;public: void traceback(int start, i原创 2015-06-28 17:38:51 · 5641 阅读 · 0 评论 -
leetcode 1 Two Sum
1. 问题描述 在给定的数组nums[]nums[]中找出两个数,他们的和target。(满足numsi+numsj=targetnums_i + nums_j = target。返回这两个数在数组中的位置,起始位置为1。且i<ji < j。 2. 方法与思路 第一遍扫描,建立hash映射;考虑到数组中可能有numsi=numsjnums_i = nums_j的情况,映射结构为map<in原创 2015-06-27 15:31:21 · 5619 阅读 · 0 评论 -
leetcode 225 Implement Stack using Queues
1. 问题描述 用队列来模拟栈的操作。实现如下栈操作: push(x) 将元素x入栈。pop() 出栈。top() 获取栈顶元素。empty() 判断是否为空。 注意:只能用队列的标准操作,队头取元素,队尾插入元素,获取队列的大小,以及队列是否为空。2 方法和思路 可以用两个队列q1和q2来实现栈的操作,设q2为辅助队列。 入栈时将元素都存入q1队列中。出栈时将q1中原创 2015-06-20 10:17:25 · 7045 阅读 · 0 评论 -
Leetcode 223 Rectangle Area
1. 问题描述 求两个矩形并的面积。 2. 方法与思路 可以先求出两个矩形的交面积,然后用两个矩形面积的和减去交面积即为矩形并面积。 注意:虽然面积不超过int的最大值,但中间边长运算时可能超过,注意处理细节,否则容易溢出。 class Solution {public: int computeArea(int A, int B, int C, int D, int原创 2015-06-21 12:27:50 · 7225 阅读 · 0 评论 -
Leetcode 226 Invert Binary Tree
1.问题描述 交换二叉树的左右子树。 2. 方法思路 直接递归交换左右子树即可,c代码如下: /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * };原创 2015-06-19 23:23:51 · 7266 阅读 · 0 评论 -
leetcode 222 Count Complete Tree Nodes (计算完全二叉树节点数)
1. 问题描述 计算完全二叉树的节点数。对于完全二叉树的定义可参考wikipedia上面的内容。2. 方法与思路 最简单也最容易想到的方法就是使用递归,分别递归计算左右子树的节点数的和。但此方法最容易超时,一般不可取。 int countNodes(TreeNode* root) { if(root == NULL) return 0; else if(ro原创 2015-06-22 14:17:37 · 8585 阅读 · 0 评论 -
Leetcode 221 Maximal Square
1. 问题描述 给出一个二维的01矩阵,计算出包含1做多的方阵,并返回包含1的个数。 2. 方法与思路 利用动态规划的思想。以右下角基准,找出最大边长。状态转移方程如下: dp[i][j] = min(d][i-1][j], dp[i][j-1], dp[i-1][j-1]) +1; 其中dp[i][j]表示以(i,j)为右下角的全1矩阵的最大边长。 class Solu原创 2015-06-23 11:19:27 · 6887 阅读 · 0 评论 -
Leetcode 218 The Skyline Problem
1. 问题描述 Notes:The number of buildings in any input list is guaranteed to be in the range [0, 10000].The input list is already sorted in ascending order by the left x position Li.The output list m原创 2015-06-25 16:44:14 · 8342 阅读 · 0 评论 -
Leetcode 217 Contains Duplicate
1. 问题描述 在一个给定的数组中,判断是否含有重复的数。2. 方法与思路 很容易的一个题目,直接hash判断即可,没有难度。 class Solution {public: bool containsDuplicate(vector<int>& nums) { if(nums.size() <= 0) return false; unordered原创 2015-06-25 17:04:19 · 5547 阅读 · 0 评论 -
Leetcode 219 Contains Duplicate II
1. 问题描述 给定一个整数数组nums[],查找是否存在两个下标i和j,满足numsi=numsjnums_i = nums_j 且|i−j|≤k|i-j| \le k。2. 思路与方法 这个问题比Contains Duplicate III要简单一些,思路方面可以参考上一篇文章Contains Duplicate III。采用“滑动窗口”+哈希的方法。不同的是,在窗口范围内只要找到满足has原创 2015-06-24 21:45:12 · 6149 阅读 · 0 评论 -
Leetcode 220 Contains Duplicate III
1. 问题描述 给定一个整数数组nums[],查找是否存在两个下标i和j,满足|numsi−numsj|≤t|nums_i-nums_j| \le t 且 |i−j|≤k|i-j| \le k。2. 方法与思路 总得思路就是:“滑动窗口”+unordered_map。 推理过程如下: |numsi−numsj|≤t⇒|numsi/t−numsj/t|≤1|nums_i-nums_j|原创 2015-06-24 19:38:02 · 8954 阅读 · 1 评论 -
Leetcode 228 Summary Ranges
1. 问题描述 给定一个升序的数组nums[](不包含重复数),求出数组中数字的范围。例如给定[0,1,2,4,5,7],返回[“0->2”,”4->5”,”7”]。2. 方法与思路 此题比较容易,只需要设一个计数器cnt,初值为nums0nums_0,然后循环遍历数组,cnt累加并与numsinums_i比较,如果相同则继续,否则将范围插入到要返回的向量中。注意处理只有一个数的情况。 c原创 2015-06-26 13:34:50 · 6067 阅读 · 0 评论 -
Leetcode 6 ZigZag Conversion
1. 问题描述 给定一个字符串和一个行数,表示按照zigzag的方式扫描的结果,编写算法输出按行扫描的结果。 2. 方法与思路 首先要先明白zigzag的顺序, 明白了zigzag扫描后,要确定zigzag中字符和按行扫描字符的对应关系。有两点: 1). 每行中的列元素都会有对应的间隔span =2∗row−22*row-2,例如行为4的zigzag扫描原创 2015-06-27 11:46:18 · 5750 阅读 · 0 评论 -
Leetcode 227 Basic Calculator II
1. 问题描述 给遗传字符串类型的表达式,计算表达式的值。表达式只包含+、-、*、/和空格。 2. 方法与思路 此题和Basic Calculator I类似,只是左右括号换成了乘除符号。基本的做法依然是先转成后缀表达式的形式,然后在进行计算。 后缀表达式用vector<long> postfix的结构存储,为了方便,操作符和操作数都保存在postfix向量中,为了区分,操作数都以负原创 2015-06-27 11:10:43 · 6415 阅读 · 0 评论 -
Leetcode 297 Serialize and Deserialize Binary Tree(序列化与反序列化二叉树)
1. 描述 设计一个算法,实现二叉树的序列化与反序列化。如何实现没有限制,只要保证一颗二叉树可以序列化为一个string串,然后这个string串可以反序列化为原来的二叉树即可。详细描述如下: 2. 方法与思路 采用先序遍历的思路,为了保证重构二叉树时,节点能够插入到数中的正确位置,空节点用“#”保存。为了保证从字符串中读取节点值方便,节点的值在字符串中用空格分开。重构时依旧安装先序的思想原创 2015-10-30 11:07:08 · 3514 阅读 · 0 评论