Leetcode
东边没有坡
不就是代码吗,我写不就是了。。。。
展开
-
LeetCode 374 Guess Number Higher or Lower
有一个猜数字的游戏,事前在1~n之间拿走一个数,然后告诉你n,每次猜一个数,假如拿走的数比你猜的数大,就返回1,小就返回-1,相同返回0,通过这个API,实现程序猜出这个数是什么。我们可以二分查找这个数,初始l = 0,r = n,每次判断guess(mid)的情况,根据guess(mid)的值来选择下一步。-1 : r = mid - 1 1 : l = mid + 1 0 : return mid由于假如n为int界限的值,那么l+r就会越界,发生计算错误,所以中间变量不能用int。原创 2017-08-10 17:12:58 · 194 阅读 · 0 评论 -
LeetCode 645 Set Mismatch
题意是有一个1-n的集合,之后数据出错导致一个数复制到另一个位置上,导致这个集合中有一个数出现了2次,有一个数出现了0次。题目和 LeetCode 448 Find All Numbers Disappeared in an Array非常相似,采用的解题方法也几乎是同一种,都是利用了把数当作下标来使用,利用负数做标记的方法,实现出现一次,和出现0次的区分。题目链接代码如下:c原创 2017-07-26 15:02:30 · 1679 阅读 · 0 评论 -
LeetCode 504 Base 7
题意:给一个十进制的数,要求把这个数转换成用字符串表示的7进制数。方法是利用短除法,将这个数依次模7再除以7,之后检测是否为负数,然后反转字符串,将值返回。原创 2017-07-26 11:45:39 · 205 阅读 · 0 评论 -
LeetCode 349 Intersection of Two Arrays
给两个数组,要求找出两个数组的子集,且子集中的元素不重复。。。思路是利用python的方便性,直接查询,边枚举边查询,若已添加到答案列表中便不再添加,毫无优化可言,,,惭愧,,,可能在枚举之前比较一下哪一个列表更短,就枚举哪一个列表可能时间会更短一些吧(抱头。。。)。原创 2017-07-27 21:36:43 · 322 阅读 · 0 评论 -
LeetCode 455 Assign Cookies
给两个数组 g 和 s 。问 s 中有最多有多少个元素可以与 g 中的元素一一映射且 大于等于g中与其一一映射的的元素?思路是先降序排序,之后枚举数组s,对于每一个s元素,寻找g中从前一个的坐标开始,第一个小于它的元素的原创 2017-07-27 22:00:51 · 176 阅读 · 0 评论 -
LeetCode 530 Minimum Absolute Difference in BST
class Solution {public: vector<int> dic; void dfs(TreeNode* node) { dic.push_back(node->val); if (node->left != NULL) { dfs(node->left); } if (node->right != NULL) { dfs(node->right);原创 2017-07-27 22:18:35 · 155 阅读 · 0 评论 -
LeetCode 108 Convert Sorted Array to Binary Search Tree
给一个排好序的数组,要求把数组转化为一个深度平均的搜索二叉树。对于二叉树,父节点一定 大于左子节点,小于右子节点,所以对应数组而言,父节点应为中间值,比它小的数放在左边,大的数放在右边,依次递归下去。原创 2017-08-04 22:39:13 · 177 阅读 · 0 评论 -
LeetCode 572 Subtree of Another Tree
给两个非空的二叉树s和t,编写函数实现判断t是否为s的子树。其中,s也可以是它自己的子树。先序遍历二叉树s,当判断s当前结点的val和t的val相同,则进入判断子树的函数,同步遍历s和t,看是否完全相同,假如不相同,则进行下一层遍历。原创 2017-08-05 10:33:23 · 180 阅读 · 0 评论 -
LeetCode 107 Binary Tree Level Order Traversal II
给一个二叉树,要求按照从底层到顶层的顺序遍历整个二叉树,每一层的节点从左到右输出。在递归的同时维护一个变量depth,表示当前的深度,每次向表示当前深度的vector添加节点,最后把ans反转一下顺序,就变成了从底层项顶层的顺序。原创 2017-08-05 12:57:15 · 153 阅读 · 0 评论 -
LeetCode 167 Two Sum II - Input array is sorted
给一个数组ascending的数组,找到两个数之和等于target的值,要求这两个数序号不相同。第一遍读题,ascending直接百度了下,,,给我的结果是攀升的,增加的,,,结果被好好的误导了一波,准确的意思应该是“非减”的,也就是说数组中同一个数可能出现多次。第一次写没注意ascending的理解,直接枚举每一个数看是否存在(target - numbers[i]),没有处理数组中的数可能会重复的bug,结果毫无悬念TLE了。ac的思路是利用二分查找,对当前的值二分查找[i+1, numbe原创 2017-07-28 11:03:43 · 165 阅读 · 0 评论 -
LeetCode 492 Construct the Rectangle
题意是给一个矩形的面积,要求给出符合下列3个条件的长和宽。W 和 L 的乘积必须等于矩形的面积L >= WL-W 的值应尽可能的小当L == W 且 L * W == area 的时候,最符合情况,这时候L-W最小,所以可以从sqrt(area)开始枚举,把找到第一个可以被area整除的W,这个值就是 L-W 最小的情况。在写的时候第一次从sqrt(area)枚举L,但是出原创 2017-07-26 15:45:21 · 265 阅读 · 0 评论 -
LeetCode 599 Minimum Index Sum of Two Lists
题意是:给两个字符串的列表,要求找出这两个列表中序号和最小的公共项,假如有多个答案,就全部输出。解决思路就是挨个找,枚举list1中的每一个,假如list2中也有,就和当前最小序的和比较,若更小,就清空答案列表,更新最小序的和,若相等,就把这个字符串也加入到要返回的答案中,没用优化,居然给过了。。。题目链接python2.7 版本:class Solution(object):原创 2017-07-27 17:06:18 · 599 阅读 · 0 评论 -
LeetCode 441 Arranging Coins
给n个硬币,要求按要求排成多行,第k行需要k个硬币,返回可以按要求排成行的行数。组成1行,需要1个组成2行,需要1+2个组成3行,需要1+2+3个组成4行,需要1+2+3+4个组成5行,需要1+2+3+4+5个。。。。。。。可推出公式组成n行,需要(1+n)*n/2个题目要求给出硬币,求出共有多少完整的行,就是对所推的公式求解,直接返回即可。原创 2017-08-10 19:42:36 · 196 阅读 · 0 评论 -
LeetCode 21 Merge Two Sorted Lists
两个有序的单链表,要求将这两个链表组成一个新的有序链表,返回新链表的头指针。给了两个指针 l1 和 l2,分别指向第一个链表和第二个链表,主要思路就是利用循环判断当前 l1 所指向的 val 和 l2 所指向 val 谁小,让node指向小的那个,并循环下去,当有一个链表指针循环结束而另一个还没有,则令node指向剩余链表即可,因为,剩余的都要比现在所有的节点大,所给的节点是有序的。原创 2017-08-04 10:56:09 · 184 阅读 · 0 评论 -
LeetCode 9 Palindrome Number
判断一个数是不是回文数,且要求不使用额外空间,负数一定不是回文数,所以我们只需要将原数不断模10,除以10,并将其个位加到 新数的个位上,即可实现数的反转,最后判断反转后的数和原数是否形同,假如相同,则为回文数。原创 2017-08-11 14:21:35 · 187 阅读 · 0 评论 -
LeetCode 100 Same Tree
给两个二叉树,要求实现判断这两棵树是否相同。假如两棵树相同,那么对于树上对应的每一个节点,都应该相同,采用中序遍历的办法,一边判断,一边遍历。原创 2017-08-04 14:33:51 · 186 阅读 · 0 评论 -
LeetCode 447 Number of Boomerangs
给定平面上所有两两不同的n个点,“boomerang”是一个点(i,j,k)的元组,使得i和j之间的距离等于i和k之间的距离(按照元组的顺序)。编写函数求boomerang的数量。n至多为500,点的坐标都在10000, 10000(包括)范围内。对于每一个boomerang,都存在一个中心点,即i点,枚举i点,记录i到其他个点的距离,看是否有相同的距离,假如有多个,则在其中选两个,构成组合数,2 * C(2, n),n为距离相等的数量,对于每一组,顺序都可以反转,所以需要乘两倍。原创 2017-08-04 16:03:21 · 249 阅读 · 0 评论 -
LeetCode 350 Intersection of Two Arrays II
给两个数组,实现求出两个数组的交集,并返回vector,要求返回的结果中单种元素出现次数应与两个数组中较小保持一致。不要求顺序。我们可以先判断一下两个数组是否为空集,之后给nums1排序,之后枚举nums2中的元素,假如nums2[i]在nums1中存在,则将此元素加之至返回结果中,并从nums1中删掉此元素。为了优化时间,将nums1排序后可以使用二分查找方法。时间复杂度 m*log(n)。原创 2017-08-04 16:23:19 · 164 阅读 · 0 评论 -
LeetCode 268 Missing Number
给一个数组,包含n个不同的元素,找到与0,1,2,3,4,,,,,n这个数组相比缺少的数,比如,数组[0, 1, 3],缺少2。要求时间复杂度是线性的。前几天做了一个类似的题目:LeetCode 645 Set Mismatch,一直在考虑利用下标做标记的方法,结果写的很麻烦,之后突然想到能不能用一个固定的数做差这种方法得出结果,然后写出了第二种思路,把所有数加起来,和从(0~n)的总和做差,差即为缺少的数原创 2017-08-04 17:04:41 · 144 阅读 · 0 评论 -
LeetCode 543 Diameter of Binary Tree
给一棵二叉树,要求寻找其中最长的路径,其中,路径的定义是任意两个节点之间的距离,,最长的路径也可能不经过根节点。通过观察可以得出,对于一个父节点,两个子节点都存在的节点而言,经过它的路径有两个方向可以选择,假如从左子节点传入,可从右子节点传出寻找最大长度,也可能从父节点传出寻找最大长度,假如只有一个子节点,那就只能选一条路。利用遍历,从下层递归到上层,便可得到最大长度。原创 2017-08-04 18:24:11 · 169 阅读 · 0 评论 -
LeetCode 453 Minimum Moves to Equal Array Elements
题意为:给一个非空的数组,数组的大小为n,允许的操作是选择其中的(n-1)个数一次加一,要求我们计算最少需要进行多少步骤才能让所有的数都相等。这个题绕了个弯子,假如说把(n-1)个数都加一,从达到所有数相等的目的来看,也就说相当于把剩余那一个没有加一的数(相对)减一,达到的目标是所有的数都相等,因为只能进行减一操作,所以我们只需要找出整个数组中的最小值,然后把其他所有数到这个数的步数求和即可。原创 2017-07-27 21:08:25 · 166 阅读 · 0 评论 -
LeetCode 53 Maximum Subarray
给一个数组,找到它的连续最大子串和是多少,并返回最大和。我们采用dp的办法,对于非首的节点,都有两种选择,延续之前的或者另开一个子串,判断条件就是,假如之前的子串和大于零,那么对于这个点而言,不论正负,延续前子串是最大的办法,而假如前子串和是小于0的,那么另开一个子串是最大办法,相当于假如要在负数和0之间选择,那会选择0而不会选择负数。原创 2017-08-05 19:44:59 · 156 阅读 · 0 评论 -
LeetCode 198 House Robber
假设是一个小偷(这比喻,,,),在这条街上有一排房子,每一个房子都有一个确定的价值,相邻的房子不能连续偷窃,问,偷了这条街后,最大偷窃的价值总和是多少?利用DP思想,对于从第4个房子开始,有两种选择,偷或不偷,假如不偷,则集成上一个房子的价值,假如偷,那么再从隔一个的还是隔两个的两个之间选择一个最大的加上这一个房子的价值,核心式是:dp[i] = max(dp[i-1], max(dp[i-2], dp[i-3]) + nums[i]);同时更新ans,因为每一个房子的dp值都是目前看来最大的,所以只原创 2017-08-05 20:18:35 · 295 阅读 · 0 评论 -
LeetCode 141 Linked List Cycle
给一个链表,判断是否有环,,,要求是不使用额外的空间。我们可以定义两个不同步速的指针,slow和fast,假如不存在环,那么fast永远不会等于slow,fast步速较快,先一步到达结尾NULL,加入存在环,那么一定存在某一步数,fast赶上了slow,此时slow和fast相同,,,我们可以利用这种方法实现不开额外空间判断环的存在。原创 2017-09-12 15:51:23 · 162 阅读 · 0 评论 -
LeetCode 101 Symmetric Tree
给一个二叉树,判断这棵树是不是关于中心轴镜像对称的,首先,要搞清楚镜像对称的特点,即左手为右手,右手为左手,,,在这颗树的判断中就是对应的两个节点中的一个左节点等于与其对应的另一个节点的右节点,另一个节点也相互对应。原创 2017-09-12 16:46:17 · 177 阅读 · 0 评论 -
LeetCode 3 Longest Substring Without Repeating Characters
给一个字符串,要求找到其最长的独特字串,这个独特字串中每一个字符都在这个子串中只出现过一次。我们可以定义两个指针指向匹配字符串的左右边界,初始为0,0,维护一个代表已出现过字符的下标的映射,每次只需要查找s[r]在映射中的数值,比较其与当前下标的关系,例如“abcabcbb”,l=0,r=0,映射pos中pos['a'] = 0,当遇到第二个‘a'时,pos['a'] = 0,在[l, r)的区间之内,所以将调整到pos['a'] +1的位置,更新r,当遇到pos中没出现过的,则更新ans的大小值,维护p原创 2017-10-18 17:27:07 · 167 阅读 · 0 评论 -
LeetCode 12 Integer to Roman
先给出百度百科关于罗马数字的书写规则:基本字符 IVXLCDM相应的阿拉伯数字表示为 1510501005001000相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;正常使用时、连写的数字重复不得超过三次;在一个数的上面画一条横线、表示这个数扩大 1000 倍。原创 2017-10-11 09:20:23 · 150 阅读 · 0 评论 -
LeetCode 137 Single Number II
给一个数组,在这个数组中除了一个数只出现过1次之外,其他数都出现过3次,要求找到这个只出现过一次的数,要求线性时间复杂度并且要求不另开内存空间。问题的关键就是设计一种方法可以记录状态,这种状态在出现3次的时候可以恢复如初,借鉴网上大佬的思路,对于每一个32bits的数,我们可以统计每一位上1的个数,假如一个数出现了三次,那么它的二进制位上对应为1的次数也为3的倍数,最后模3,假如不是0,则说明这一位是要找的那一个数的某一位,将这一位记录下来,最后统计相或即可。原创 2017-10-28 13:08:55 · 157 阅读 · 0 评论 -
LeetCode 647 Palindromic Substrings
给一个字符串,要求数出这个字符串的子串中有多少个是回文串,不同起点的子串即为不同。字符串长度不超过1000。对于每一个字符,它本身一定是一个回文串,所以我们可以枚举每一个字符作为回文串中心,向外扩展,extendPalindrome函数可以借鉴题目5.Longest Palindromic Substring,分为单个中心和两个字符为中心的情况来讨论,向两边来扩展,每次统计结果+1即可。原创 2017-10-28 13:39:41 · 172 阅读 · 0 评论 -
LeetCode 19 Remove Nth Node From End of List
给一个链表,去掉从后面数第n个结点,并且返回链表的首结点。要求:给定的n一定为有效合法的值,并且尽量一步达到要求。常规思路是先计算链表的长度len,之后计算正序idx = len-n,然后进行删除结点算法,原创 2017-10-28 14:04:10 · 190 阅读 · 0 评论 -
LeetCode 560 Subarray Sum Equals K
给一个数组nums和一个整数k,要求在数组的连续子集中找到sum等于k的个数。两点要求:1. 数组长度在1~20000之间。2. 数组中的数在-1000~1000之间,k的取值范围在-1e7~1e7之间。在进行统计之前先进行计算这个数组的前n项累加和,将和统计到数组sum中,sum[i] 代表从nums[0]项开始累加到nums[i],之后统计是否存在起点j和终点i,使得两者之间的值之和等于k,即sums[i] - sum[j] + nums[j] == k。原创 2017-10-29 16:31:10 · 311 阅读 · 0 评论 -
LeetCode 204 Count Primes
给一个数n,要求给出小于n的素数的数量。常用的素数筛选方法有埃氏筛选法和欧拉筛选法,具体方法参考大佬博客,先创建一个大小为n+1的boolean数组flag,用来标记是否是素数,另创一个int表prime用来存当前筛选出的素数,欧拉筛法与埃式筛法的区别在于欧拉筛法是用当前已筛选出的素数再去累乘来继续筛选,时间复杂度更低。原创 2017-11-02 15:44:09 · 205 阅读 · 0 评论 -
LeetCode 438 Find All Anagrams in a String
给一个字符串s(未知是否为空),和一个模版字符串p(不为空),要求找到以模版字符串p的字母排列组合后形成的字符串在s中的序的集合(vector)。我们可以统计模版字符串中各个字母出现的次数,放在数组model中,之后从0开始遍历s,将从i到i+p.length()-1的字母出现次数存放在数组v中,每次维护数组v,并比较v和model是否相同,相同则将当前i加入到ans中即可。原创 2017-09-19 10:10:32 · 278 阅读 · 0 评论 -
LeetCode 7 Reverse Integer
给一个数,将这个数反转过来,假如反转之后对于signed-int而言会溢出的话,那么就返回0,否则返回反转之后的数。我们可以在int和long long分别设置一个变量,用于存储所给数的绝对值反转之后的数,之后判断这两个临时变量是否相同,假如不相同,则说明存在溢出,否则再判断是否是负数,返回正确答案。原创 2017-09-19 09:36:03 · 314 阅读 · 0 评论 -
LeetCode 383 Ransom Note
给一个目标字符串ransomNote和一个库字符串magazine,要求使用magazine中的字符重组成ransomeNote,每一个字符只可使用一次。所有给出的字符全部为小写。统计magazine中所有字母出现的次数,再枚举ransomNote中的字符,每次将已统计的数量减一,假若该字母的数量为负,则说明不成功,返回false。否则全部枚举完之后,说明magezine中的字符可以重组成ransomNote,返回true。原创 2017-07-28 19:52:23 · 156 阅读 · 0 评论 -
LeetCode 563 Binary Tree Tilt
给一个二叉树,让求出整棵树的tilt,单个节点的tilt的定义为左子数的val总和与右子树val总和的差的绝对值,整棵树的tilt定义为所有节点的tilt的总和。原创 2017-07-29 11:08:45 · 171 阅读 · 0 评论 -
LeetCode 168 Excel Sheet Column Title
给一个数,要求用excel中的编号来表示,,,其中,1对应A,2对应B,,,以此类推,,,其实是一个十进制转换为26进制的问题。通过观察可得,A~Z分别对应1-26,当26%26结果为0,所以Z的位置应该放在0上。原创 2017-07-29 11:33:20 · 298 阅读 · 0 评论 -
LeetCode 235 Lowest Common Ancestor of a Binary Search Tree
给一个二叉搜索树,找到给定两个节点的最低的公共祖先节点。这题首先应考虑二叉搜索树的性质,对于每一个节点,左子节点小于父节点,右子节点大于父节点,所以最低的公共祖先节点一定符合p和q分布在其左支和右支上的性质,通过判断p,q的val与root的val大小,判断p,q在root的哪边分支上,然后递归或循环,直到root满足左右分支分别有一个p或q为止。原创 2017-08-07 11:31:06 · 184 阅读 · 0 评论 -
LeetCode 66 Plus One
给一个用数组表示的非负的数,现在把这个数加1,返回vector形式的数。不允许前置0,除非这个数是0。这个数越大的位越在前面,所以个位应在vector的末尾,依次向前,位数不断变大。可以先将数组反转,用一个变量标记是否有进位,将最后一位加1,然后依次判断是否大于9,在运算时加上进位数,再取模10。之后判断是否还有进位,有则向数组中加入新数,无则不加,最后反转数组。原创 2017-08-07 14:51:37 · 164 阅读 · 0 评论 -
LeetCode 58 Length of Last Word
给一个字符串,由字母和空格组成,问最后一个单词的长度,一个字母也可为一个单词。从后向前找第一个字母,之后再找到连续字母的长度,即为所要求的长度。原创 2017-09-13 14:43:28 · 157 阅读 · 0 评论