LeetCode
文章平均质量分 56
浅语笑笑
这个作者很懒,什么都没留下…
展开
-
<LeetCode> 题1: A+B求和
LeetCode 1: A+B求和题目描述给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。思路:由于不能适用+等运算符,根据提示,应该用位运算来完成。 异或运算(^)可以模拟一种不进位加法,比如:10^11=01,每一位的加法就相当于该位相加,但不进位。接下来的问题就是如何解决进位问题!由于异或运算仅仅是忽略了进位,那么每次有进位发生时,异或运算相当于忽略了高位的一个1。 按位原创 2016-07-08 14:10:18 · 2244 阅读 · 0 评论 -
<LeetCode> 题14:二分查找
题目描述:给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。 例如:在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2。思路:首先比较中间的数和要查找的数,如果关键字(要查找的数)小于中间的数,那么在数组的左半部分继续查找,如果关键字大于中间的数,那么原创 2016-07-17 12:02:52 · 579 阅读 · 0 评论 -
<LeetCode> 题362:最大滑动窗口
1. 题目描述:给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。 注意:假设输入的k在数组大小范围之内。 例如: 给出数组 [2, 3, 4, 2, 6, 2, 5, 1],滑动窗口大小为 k = 3,则返回 [4,4,6,6,6, 5]。 [2, 3, 4], 2, 6, 2, 5, 1 –> max = 4原创 2016-07-17 18:22:09 · 1321 阅读 · 0 评论 -
<LeetCode> 题54:转换字符串到整数
题目描述:实现atoi这个函数,将一个字符串转换为整数。 • 如果前面有空格开头,忽略掉开头的所有空格 • 如果发现没意义的字符,忽略之,并结束转换。即123ttyw -> 123 • 考虑负数 • 如果整数超出了32位整数的范围,即溢出,则返回相应的最大正数INT_MAX(2147483647)和最大负数INT_MIN(-2147483648)。 比如: “10” =>原创 2016-07-18 18:37:59 · 374 阅读 · 0 评论 -
<LeetCode> 题56:两数之和
1. 题目描述:给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 n,不是以 0 开头。 注意:你可以假设只有一组答案。 例如:给出 numbers = [2, 7, 11, 15], target = 9, 返回 [1, 2].2. 思路一:暴力求解通过双重循环原创 2016-07-19 09:53:10 · 1588 阅读 · 0 评论 -
<LeetCode> 题57:三数之和
题目描述:给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。 注意: 1)在三元组(a, b, c),要求a <= b <= c。 2)结果不能包含重复的三元组。 例如:给定数组S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是: (-1, 0, 1) (-1, -1, 2)思路:先对数组排序,然后第一个数先原创 2016-07-19 18:16:12 · 493 阅读 · 0 评论 -
<LeetCode> 题201:线段树的构造
题目描述:线段树是一棵二叉树,它的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值: –>根节点的 start 和 end 由 build 方法所给出。 –>对于节点 A 的左儿子,有start=A.left, end=(A.left + A.right) / 2。 –>对于节点 A 的右儿子,有start=(A.lef原创 2016-08-03 18:27:07 · 942 阅读 · 0 评论 -
<LeetCode> 题439:线段树的构造(2)
题目描述:线段树是一棵二叉树,它的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间。start和end都是整数,并按照如下的方式赋值: –>根节点的 start 和 end 由 build 方法所给出。 –>对于节点 A 的左儿子,有start=A.left, end=(A.left + A.right) / 2。 –>对于节点 A 的右儿子,有start=(A.lef原创 2016-08-03 18:34:17 · 371 阅读 · 0 评论 -
<LeetCode> 题202:线段树的查询
题目描述:对于一个有n个数的整数数组,在对应的线段树中, 根节点所代表的区间为0-n-1, 每个节点有一个额外的属性max,值为该节点所代表的数组区间start到end内的最大值。为SegmentTree设计一个 query 的方法,接受3个参数root, start和end,线段树root所代表的数组中子区间[start, end]内的最大值。例如: 对于数组 [1, 4, 2, 3], 对应的原创 2016-08-03 18:37:20 · 368 阅读 · 0 评论 -
<LeetCode> 题247:线段树的查询(2)
题目描述:对于一个数组,我们可以对其建立一棵线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数。(数组中并不一定每个位置上都有元素)实现一个 query 的方法,该方法接受三个参数 root, start 和end, 分别代表线段树的根节点和需要查询的区间,找到数组中在区间[start, end]内的元素个数。例如: 对于数组 [0, 空,2, 3], 对应原创 2016-08-03 18:39:37 · 526 阅读 · 0 评论 -
<LeetCode> 题203:线段树的修改
题目描述:对于一棵 最大线段树, 每个节点包含一个额外的 max 属性,用于存储该节点所代表区间的最大值。设计一个 modify 的方法,接受三个参数 root、 index 和value。该方法将 root 为根的线段树中[start, end] = [index, index]的节点修改为了新的 value ,并确保在修改后,线段树的每个节点的 max 属性仍然具有正确的值。例如: 对于线段树原创 2016-08-03 18:45:10 · 414 阅读 · 0 评论 -
<LeetCode> 题15:全排列(不带重复元素)
题目描述:给定一个数字列表,返回其所有可能的排列。 例如: 给出一个列表[1,2,3],其全排列为: [ [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1] ]思路1:从集合中依次选出每一个元素作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归从而得到全排列。原创 2016-07-31 15:13:03 · 2664 阅读 · 0 评论 -
<LeetCode> 题31:数组划分
题目描述:给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得: –>所有小于k的元素移到左边 –>所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k。注意事项:你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回 nums.le原创 2016-07-31 15:36:52 · 1091 阅读 · 0 评论 -
<LeetCode> 题373:奇偶分割数组
题目描述:分割一个整数数组,使得奇数在前偶数在后。 例如: 给定 [1, 2, 3, 4],返回 [1, 3, 2, 4]。代码:class Solution{public: void partitionArray(vector<int> &nums) { int i = 0, j = nums.size() - 1; while (i原创 2016-07-31 15:40:40 · 530 阅读 · 0 评论 -
<LeetCode> 题41:最大子数组
题目描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。 注意:子数组最少包含一个元素 例如: 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1],其最大和为6思路1:穷举法三层循环,穷举出所有子数组,分别求子数组的和,找到其中和最大的一个。 时间复杂度:O(n3)class Solution {public: i原创 2016-07-31 15:44:48 · 575 阅读 · 0 评论 -
<LeetCode> 题44:最小子数组
题目描述:给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。 注意:子数组最少包含一个数字 例如: 给出数组[1, -1, -2, 1],返回 -3代码:class Solution {public: int minSubArray(vector<int> nums) { int minSum = nums[0]; int sum =原创 2016-07-31 15:45:44 · 1139 阅读 · 0 评论 -
<LeetCode> 题40:两个栈实现一个队列
题目描述:使用两个栈来实现队列的一些操作:push()、pop()、top()思路:创建两个栈S1和S2,入队时,将元素压入S1,出队时,如果栈S2中的元素个数为0,则将S1中的元素一个个压入S2,并弹出最后压入的那个元素,如果栈S2中的元素个数不为0,则直接弹出S2中的顶元素。代码:class Queue {public: stack<int> stack1; stack<in原创 2016-07-21 14:28:34 · 1001 阅读 · 0 评论 -
<LeetCode> 题365:二进制中有多少个1
题目描述:计算在一个 32 位的整数的二进制表式中有多少个 1. 例如: 给定 32 (100000),返回 1 给定 5 (101),返回 2 给定 1023 (111111111),返回 9思路1:将1不断左移,再与n相与(&)例如:要求5的二进制中有多少个1,就需要让5(101)分别与0……0001,0……0010,0……0100,0……1000,… …,1……0000进行与运算,如果原创 2016-07-21 14:34:39 · 1420 阅读 · 0 评论 -
<LeetCode> 题13:字符串查找(strstr)
题目描述:对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1。 例如: 如果 source = “source” 和 target = “target”,返回 -1。 如果 source = “abcdabcdefg” 和 target = “bcd”,返回 1。解析原创 2016-07-17 11:48:04 · 1876 阅读 · 0 评论 -
<LeetCode> 题12: 带最小值操作的栈
题目描述:实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。**注意:**如果堆栈中没有数字则不能进行min方法的调用。例如:如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1思路:这题原创 2016-07-15 17:07:44 · 2424 阅读 · 0 评论 -
<LeetCode> 题2:n阶乘尾部零的个数
题目描述:设计一个算法,计算出n阶乘中尾部零的个数。注意:时间复杂度为O(lgn)。思路:要求n的阶乘,就是求1到n这n个数相乘。在这1到n个数当中,只有2和5相乘的结果才会出现0,其中10的倍数也可以看做是2和5相乘的结果,所以,可以在1到n之间看看有多少个数是2的倍数以及多少个数是5的倍数就行了。容易发现2的倍数的数一定多于5的倍数的数,因此可以只看n前面有多少个5就行了,于是n/5可以得到1到原创 2016-07-11 14:45:22 · 3476 阅读 · 0 评论 -
<LeetCode> 题3:统计数字
题目描述:计算数字k在0到n中的出现的次数,k可能是0~9的一个值 例如n=12,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]中,我们发现1出现了5次 (1, 10, 11, 12) 思路一:我们可以用最简单的办法先尝试一下,遍历1到n中间的每个整数,对每个整数从低位到高位依次检查,如果有k出现则计数器自加。 思路一最大的问题就是效率,当n非常大时,原创 2016-07-11 17:46:30 · 3568 阅读 · 7 评论 -
<LeetCode> 题4:丑数
题目描述:设计一个算法,找出只含素因子2,3,5 的第 n 大的数。 符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12… 注意:1也是丑数 例如:输入9,则输出10思路一:暴力解法从1开始依次向后判断各自然数是否为丑数,一直判断到第n个丑数,返回第n个丑数的值。 第一步:先判断每一个数m是否为丑数:可以试着用2、3、5不断整除m,当m不能再被2、3、5整除时,判断原创 2016-07-12 09:47:18 · 1832 阅读 · 0 评论 -
<LeetCode> 题33:N皇后问题
题目描述:n -皇后 问题就是正确的在棋盘上面放置皇后的位置,从而使得任意两个皇后之间都无法攻击对方,攻击的方式是同行、同列或对角线。 给定 n ,要求返回n-皇后问题的所有解。每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“x”分别表示一个女王和一个空位置。思路:回溯法1) 算法开始, 清空棋盘,当前行设为第一行,当前列设为第一列 2) 在当前行,当前列的位置上判断是否满足条件(即原创 2016-07-12 15:58:45 · 1444 阅读 · 0 评论 -
<LeetCode>题66~68: 二叉树的遍历
1. 题目描述:给出一棵二叉树,返回其节点值的前序遍历、中序遍历、后序遍历。 例如: 4 / \ 2 6 / \ / \ 1 3 5 7 前序遍历(根—左—右):4, 2, 1, 3, 6, 5, 7 中序遍历(左—根—右):1, 2, 3, 4, 5, 6, 7 后序遍历(左—右—根):1, 3, 2, 5, 7, 6, 4原创 2016-07-13 14:59:27 · 875 阅读 · 0 评论 -
<LeetCode> 题69~71: 二叉树的层级遍历
1. 题目描述给定一课二叉树(如下),分别完成从上往下层级遍历、从下往上层级遍历、Z字形从上往下层级遍历: 4 / \ 2 6 / \ / \ 1 3 5 7 输出结果如下: 第一种情况:从上往下层级遍历: [ [4], [2,6], [1,3,5,7] ] 第二种情况:从下往原创 2016-07-14 14:13:47 · 726 阅读 · 0 评论 -
<LeetCode> 题452:删除链表中的元素
1. 题目描述:删除链表中等于给定值val的所有节点。 例如: 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。分析: 该题就是把与给定的val值相同的元素从链表中删除。需要注意的是,删除的点在链表头与表身需要分开处理。2. 链表数据解结构/** * struct ListNode * { * int v原创 2016-07-26 13:49:24 · 411 阅读 · 0 评论 -
<LeetCode> 题166:链表倒数第n个结点
1. 题目描述:找到单链表倒数第n个节点,保证链表中节点的最少数量为n。 例如:给出链表 3->2->1->5->null和n = 2,返回倒数第二个节点的值2. 链表数据结构/** * struct ListNode * { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {原创 2016-07-26 13:53:30 · 1017 阅读 · 0 评论 -
<LeetCode> 题174:删除链表中倒数第n个结点
1. 题目描述:给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。 例如: 给出链表1->2->3->4->5->null和 n = 2。 删除倒数第二个节点之后,这个链表将变成1->2->3->5->null。分析: 这一题是在寻找链表倒数第n个结点的基础上增加了一个功能,也就是将找到的这倒数第n个结点删掉。2. 链表数据结构/** * struct ListNode * {原创 2016-07-26 13:55:52 · 293 阅读 · 0 评论 -
<LeetCode> 题112:删除排序链表中的重复元素
1. 题目描述:给定一个排序链表,删除所有重复的元素,每个元素只留下一个。 例如: 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null2. 链表数据结构/** * struct ListNode * { * int val; * ListNode *next; * Lis原创 2016-07-26 14:00:27 · 639 阅读 · 0 评论 -
<LeetCode> 题113:删除排序链表中的重复元素2
1. 题目描述:给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。 例如: 给出 1->2->3->3->4->4->5->null,返回 1->2->5->null 给出 1->1->1->2->3->null,返回 2->3->null2. 链表数据结构/** * struct ListNode * { * int val; * ListNode原创 2016-07-26 14:03:11 · 310 阅读 · 0 评论 -
<LeetCode> 题35:翻转链表1(翻转整个链表)
1. 题目描述:翻转一个链表,例如:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null。2. 链表数据结构/** * struct ListNode * { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * };**/3. 代码3.1原创 2016-07-26 14:08:44 · 668 阅读 · 0 评论 -
<LeetCode> 题36:翻转链表2(翻转指定部分)
1. 题目描述:翻转链表中第m个节点到第n个节点的部分 注意:m,n满足1 ≤ m ≤ n ≤ 链表长度 例如:给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null2. 链表数据结构/** * struct ListNode * { * int val; * ListNode *next; * L原创 2016-07-26 14:13:09 · 1128 阅读 · 0 评论 -
<LeetCode> 题5:第k大元素
题目描述:在数组中找到第k大的元素。例如: 给出数组 [9,3,2,4,8],第三大的元素是 4 给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推。思路一:利用C++自带的sort函数,现排序后选择。时间复杂度:O(N*logN),空间复杂度:O(1)。 **注意:**sort函数包含在#include头文件中写法一:(采用vector)i原创 2016-07-15 16:26:10 · 776 阅读 · 0 评论 -
<LeetCode> 题6:合并两个排序数组
题目描述:合并两个排序的整数数组A和B变成一个新的数组。比如:给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]。 注意:这里假设A有足够空间能够容得下B,并且数组A和B的初始元素个数分别为m和n思路:A和B都已经是排好序的数组,我们只需要从后往前比较就可以了。 因为这是数组而不是链表,它们是有索引的,索引是从前到后的。如果在数组前方添加一个数字,那么其原创 2016-07-15 16:33:58 · 2250 阅读 · 0 评论 -
<LeetCode> 题8:旋转字符串
题目描述:给定一个字符串和一个偏移量,根据偏移量旋转字符串。 例如:对于字符串 “abcdefg”。 offset=0 => “abcdefg” offset=1 => “gabcdef” offset=2 => “fgabcde” offset=3 => “efgabcd”思路一:采用截断函数substr来实现string rotateString1(string s, int offs原创 2016-07-15 16:43:58 · 910 阅读 · 2 评论 -
<LeetCode> 题9:Fizz Buzz问题
题目描述:给你一个整数n. 从 1 到 n 按照下面的规则打印每个数: 1. 如果这个数被3整除,打印fizz; 2. 如果这个数被5整除,打印buzz; 3. 如果这个数能同时被3和5整除,打印fizz buzz; 4. 如果这个数既不能被3整除,也不能被5整除,打印它本身。思路:先判断能否被15整除,然后判断被3整除,然后判断被5整除。注意跳过0。代码:#include <ios原创 2016-07-15 16:48:01 · 1208 阅读 · 0 评论 -
<LeetCode> 题366:斐波那契数列
1. 题目描述:查找斐波纳契数列中第 N 个数。 所谓的斐波纳契数列是指:前2个数是 0 和 1 。第 i 个数是第 i-1 个数和第i-2 个数的和。斐波纳契数列的前10个数字是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34 … 例如: 给定 1,返回 0 给定 2,返回 1 给定 10,返回 342. 思路1:递归求解long long fib(unsigned in原创 2016-07-21 14:52:46 · 1086 阅读 · 0 评论