LeetCode
缪斯赤贫
这个作者很懒,什么都没留下…
展开
-
448. Find All Numbers Disappeared in an Array的C++解法
假设存在值nums[i],则用nums[nums[i]]标记其存在(我使用的方法是加上数组的长度,因为给定的条件是数组内的数不大于数组长度),最后遍历数组看看没有大于数组长度的数就是不存在的数。需要注意的问题:1.边界问题。数组从0开始,但是序列从1开始,有一个差1的关系。2.后面的数在遍历到自己的时候,里面的数可能已经改变了(比如a[7]=2,但是因为a[0]~a[6]中有7存在,所原创 2017-03-28 11:20:17 · 257 阅读 · 0 评论 -
496. Next Greater Element I的C++解法
pascal写多了就有个毛病老是分不清数组的上下界,边界带不带等号半天改不明白。没想出这个题有啥快捷的算法,就老老实实把每个元素都找一遍,时间复杂度O(n²)。class Solution {public: vector nextGreaterElement(vector& findNums, vector& nums) { if (findNums.empty()) return f原创 2017-03-21 14:33:03 · 200 阅读 · 0 评论 -
520. Detect Capital的C++解法
因为首字母可以和第二个字母不一样,所以从第二个字母开始检测之后的字母是否一致就可以了。但是需要排除首字母是小写之后是大写的情况。class Solution {public: bool detectCapitalUse(string word) { if ((word[1] >= 65) && (word[1] = 97) && (word[0] <= 122)) return fal原创 2017-03-29 11:27:55 · 228 阅读 · 0 评论 -
463. Island Perimeter的C++解法
思路挺简单的就是找规律,遍历每个点,如果这个点是1的话默认它有四条边,但是如果有一个相邻的1就少一条边。常数向量pq是上下左右四个相邻点的坐标位移。class Solution {public: int islandPerimeter(vector>& grid) { int m = grid.size(); int n; if (m != 0) n = grid[0].siz原创 2017-03-22 16:25:46 · 265 阅读 · 0 评论 -
292. Nim Game的C++解法
考虑:1.有1,2,3颗石子,我方可以直接取胜。2.有4颗石子,我方无论如何都不可能取胜,因为无论怎么拿都会给对方剩下正好能取走的石子。 (可以发现,剩4颗石子的时候谁先手谁输。)3.有5,6,7颗石子,我方可以通过拿1,2,3颗石子,使局面变成剩4颗石子且对方先手。4.有8颗石子,我方无论怎样拿,对方都可以造成剩4颗石子且我方先手的局面,我方不可能赢。5.以此类推,只原创 2017-03-23 11:28:48 · 359 阅读 · 0 评论 -
104. Maximum Depth of Binary Tree的C++解法
用递归,当前树的深度就是左右子树中深度更深的那个+1。注意边界条件和判断子树为空的情况。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val原创 2017-03-30 13:31:29 · 335 阅读 · 0 评论 -
258. Add Digits的C++解法
两层while循环,第一层判断是不是加到只剩一位了,第二层循环负责累加各位的和pic2.zhi。class Solution {public: int addDigits(int num) { while (num >= 10) { int temp = num; num = 0; while (temp > 0) { num = num + tem原创 2017-04-07 09:15:43 · 407 阅读 · 0 评论 -
492. Construct the Rectangle的C++解法
判断一下能不能直接平方根,不能的话每次减一检查能否被整除即可。class Solution {public: vector constructRectangle(int area) { int w = sqrt(area); vector result; if (w*w == area) { result.push_back(w); result.push_ba原创 2017-04-10 10:26:20 · 230 阅读 · 0 评论 -
485. Max Consecutive Ones的C++解法
感觉没啥好说的啊= =,应该没人做不出来吧。但是评测速度落到了后百分之十是什么鬼啦!class Solution {public: int findMaxConsecutiveOnes(vector& nums) { int count = 0; int max = 0; for (int i = 0; i < nums.size(); i++) { if (nums原创 2017-03-24 10:03:32 · 273 阅读 · 0 评论 -
389. Find the Difference的C++解法
要考虑到统计重复字母的个数,比如s里有3个a,t里面有4个a,所以多出来的是a。我的解决办法就是找到一个删除一个,要使用迭代器。class Solution {public: char findTheDifference(string s, string t) { int i; for (i = 0; i < t.length(); i++) { int flag = 1原创 2017-03-31 11:05:13 · 403 阅读 · 0 评论 -
461. Hamming Distance的C++解法
我自己最初的解法,愚蠢至极:class Solution {public: int hammingDistance(int x, int y) { int x1[32]; int x2[32]; int i = 31; int sum=0; for (i; i >=0; i--) { x1[i] = x % 2; x = x /原创 2017-03-14 10:02:44 · 320 阅读 · 0 评论 -
371. Sum of Two Integers的C++解法
考虑还是应该用二进制的位运算实现加法。每一位的结果可以用异或表达,进位用按位与记录,只要将进位结果左移一位然后和异或结果相加就可以了。但是这里相加还是会有进位的情况,所以需要用循环不断重复这个操作,直到没有进位为止。class Solution {public: int getSum(int a, int b) { do { int at = a^b; int bt =原创 2017-04-01 10:09:12 · 305 阅读 · 0 评论 -
500. Keyboard Row的C++解法
题目分析:给出的模板是一个引用,我表示很懵逼。问了一下枭哥。&为左值的时候表示和右边的变量指向同一个内存空间。如:int a=3;&b=a;//b指向a的内存,a改变则b跟着改变&为右值的时候标示取地址,如:int a=3;int *b;b=&a;//b的指是a在内存中的地址c=*b;//c取到了a的值在传参中&相当于取左值。我的代码思路很简单。就是把键盘的原创 2017-03-15 13:20:09 · 804 阅读 · 0 评论 -
476. Number Complement的C++解法
本来以为上一道题我的写法是最蠢的,没想到这道题用了更蠢的写法,而且竟然没想出来怎么写效率更高。运行速度垫底。class Solution {public: int findComplement(int num) { int x[32]; int i = 31; while (num) { x[i] = num % 2; num = num /原创 2017-03-14 11:12:55 · 234 阅读 · 0 评论 -
412. Fizz Buzz的C++解法
思路就是用%取余做判断:class Solution {public: vector fizzBuzz(int n) { int i = 1; vector result; for (i; i <= n; i++) if ((i % 3 == 0) && (i % 5 == 0)) result.push_back("FizzBuzz"); else if (i %原创 2017-03-16 10:11:12 · 841 阅读 · 0 评论 -
344. Reverse String的C++解法
感觉问题特别简单啊,这是第一版的代码:class Solution {public: string reverseString(string s) { string result=""; for (int i = s.length()-1; i >= 0;i--) result = result + s[i]; return result; }};结果运行显示内...原创 2017-03-17 10:33:28 · 352 阅读 · 0 评论 -
136. Single Number的C++解法
我觉得我是一个傻子。因为题目限制了用线性复杂度且不扩展内存,一开始我想的是用nums[nums[i]]的正负号标记nums[i]出现的次数,后来发现给出的原序列没有说本来就是正整数。然后想了很久都没想出来。其实这个题的关键在于只有一个数是不重复的,已知A XOR A=0,A XOR B XOR A=B,只要把所有数连续异或就好了。class Solution {public: int si原创 2017-03-27 11:23:31 · 345 阅读 · 0 评论 -
283. Move Zeroes的C++解法
i代表遍历整个vector的下标,j代表已经交换到了哪个位置。把nums[j]换到nums[i]处,剩下的全部补0就行了。class Solution {public: void moveZeroes(vector& nums) { int j = 0; for (int i = 0; i < nums.size(); i++) { if (nums[i] != 0)原创 2017-04-13 10:03:38 · 202 阅读 · 0 评论 -
171. Excel Sheet Column Number的C++解法
其实就是二十六进制转换成十进制而已。class Solution {public: int titleToNumber(string s) { int sum = 0; int k = 1; for (int i = s.length()-1; i>=0; i--) { sum = sum + (s[i]-'A'+1) * k; k = k * 26; }原创 2017-04-28 10:03:42 · 241 阅读 · 0 评论 -
506. Relative Ranks的C++解法
本质就是一个排序问题。考虑到时间复杂度的问题选择了快排,但是好像不是很方便。需要一个额外的索引数组,出于题目限制还要有一个记录原始顺序的数组。感觉空间开销稍微大一点。不过速度还是挺快的。class Solution {public: vector id; void quickSort(vector& s, int l, int r){ if (l < r) { int i原创 2017-04-18 10:35:55 · 221 阅读 · 0 评论 -
521. Longest Uncommon Subsequence I的C++解法
一开始没看明白这个题,后来才发现非常弱智。因为问的是最长的不相同子串,那么只要两个字符串不相等就返回较长字符串的长度就好了。class Solution {public: int findLUSlength(string a, string b) { if (a==b) return -1; else return a.length()>b.length() ? a.l原创 2017-04-14 10:32:59 · 296 阅读 · 0 评论 -
226. Invert Binary Tree的C++解法
考虑到要遍历整棵树,所以选了广度优先遍历的方法,把每个节点加入队列之后交换它的左右子树指针就好了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x)原创 2017-04-06 10:37:37 · 394 阅读 · 0 评论 -
167. Two Sum II - Input array is sorted的C++解法
一开始是先写了个二分查找法找到比target小的最大数字然后再搜索两个数的和,后来发现题目中没有说数字不为负。所以就删掉之前的部分,一个从后往前一个从前往后,两个数的和小于target就前面的向后挪一位,反之则后面的向前挪一位。class Solution {public: vector twoSum(vector& numbers, int target) { int i = 0;原创 2017-04-19 11:51:25 · 186 阅读 · 0 评论 -
455. Assign Cookies的C++解法
主要思路就是贪心算法。将两个容器从大到小排序然后依次比较,我用了前面几道题里提到的优先队列,这样就不用自己排序了。class Solution {public: int findContentChildren(vector& g, vector& s) { priority_queue cookies; priority_queue kids; for (int i = 0;原创 2017-04-20 09:23:06 · 264 阅读 · 0 评论 -
557. Reverse Words in a String III的C++解法
依次查找空格,把每一个单词作为一个小string进行反转,注意最后一个单词后面没有空格也要反转。class Solution {public: string reverseWords(string s) { int j = 0; for (int i = 0; i < s.length(); i++) if ((s[i] == 32) || (i == s.length()-原创 2017-04-11 10:37:59 · 406 阅读 · 0 评论 -
530. Minimum Absolute Difference in BST的C++解法
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。我的思路就是用中序遍历得到一个递增序列存放到vector里,然后检查相邻两个元素的差,找到最小值。这原创 2017-04-17 10:21:46 · 238 阅读 · 0 评论 -
453. Minimum Moves to Equal Array Elements的C++解法
看到这道题的时候就觉得一定有非常简单的算法,但是作为一个数学渣渣用笔算了半天没能找到。只好写了一个最笨的代码按部就班来算,即每次找到最大的一个数,把剩下的数字全部加一,直到所有的数字相等为止。class Solution {public: int findMax(vector& nums){ int a = nums[0]; int ai = 0; int i = 1; f原创 2017-04-21 10:04:52 · 201 阅读 · 0 评论 -
563. Binary Tree Tilt的C++解法
一看到这个题的时候我是这样想的,假如根节点到节点x的路径是左→ 右→ 左,那么sum=sum+x-x+x,这样只需要对每一个节点做这个操作就可以了。但是我没写出来怎么记录根节点到当前节点路径的代码。所以只好用最笨的方法,广度遍历每个点求解Tilt,又写了一个tcount函数求当前子树的总值。class Solution {public: int tcount(TreeNode* root)原创 2017-04-26 11:55:44 · 337 阅读 · 0 评论 -
561. Array Partition I的C++解法
尽量把小的数字分到一组就可以了。用快排,然后把0,2,4,6...个数相加。一开始写了个插排超时了。class Solution {public: void quickSort(vector& s, int l, int r){ if (l < r) { int i = l, j = r, x = s[l]; while (i < j) { while (原创 2017-04-25 16:37:53 · 789 阅读 · 0 评论 -
383. Ransom Note的C++解法
感觉题目说的不明白,一开始我理解的是整个字符串要完整的出现在Magazine里才行,后来发现只要RansomNote里的字母出现次数少于Magazine里的就好了。所以借鉴前两个题的解法用了hash表的结构。class Solution {public: bool canConstruct(string ransomNote, string magazine) { vector has原创 2017-04-27 10:26:17 · 299 阅读 · 0 评论 -
349. Intersection of Two Arrays的C++解法
跟383.Ransom Note的思路一样。不同的是这个题不用计数。题目没给数据规模,我自己随便写了个-10000到+10000的范围,过了,beats10%,改成-1000到+1000也能过,beats44%,感觉速度消耗主要在初始化上了。class Solution {public: vector intersection(vector& nums1, vector& nums2) {原创 2017-04-27 10:48:42 · 441 阅读 · 0 评论 -
404. Sum of Left Leaves的C++解法
广度优先遍历,只判断左子树是不是叶子,是的话求和。class Solution {public: int sumOfLeftLeaves(TreeNode* root) { if (root == NULL) return 0; else{ queue q; q.push(root); int sum = 0; while (!q.empty()) {原创 2017-04-27 14:36:14 · 167 阅读 · 0 评论 -
387. First Unique Character in a String的C++解法
还是用hash表的算法。注意如果都没有单个的字母要返回-1。另外注意是字符不是字母,数组范围(0,255)class Solution {public: int firstUniqChar(string s) { vector<int>hash(256, 0); for (int i = 0; i < s.length(); i++) hash[s[i]]++...原创 2017-04-27 14:57:58 · 224 阅读 · 0 评论 -
122. Best Time to Buy and Sell Stock II的C++解法
题目说得不是特别清楚,研究了好几遍,意思其实就是只有一支股票,卖了之后才能再买进,买了之后才能再卖出。但是不限制交易次数。看起来特别复杂其实用贪心就可以解决。对于每一笔交易 假设是从i天买入 j天卖出 ,如果有j+1天的价格高于j天,所以肯定是从i到j+1利润更高,同样的如果有第i-1天价格比第i天更低,肯定是从i-1天到j天利润更高。画个曲线图更容易理解,只要在低谷买入,高峰卖出,收益就是最原创 2017-04-27 15:49:37 · 345 阅读 · 0 评论 -
566. Reshape the Matrix的C++解法
思路就是新建一个vector数组把旧的数组里的内容一个一个填进去。class Solution {public: vector> matrixReshape(vector>& nums, int r, int c) { if (nums[0].size()*nums.size() < r*c) return nums; else { int h = nums.size();原创 2017-06-06 17:16:56 · 711 阅读 · 0 评论 -
575. Distribute Candies的C++解法
最多一个人只能分到candies.size()/2的不同种类的糖,只要遍历数组保证每次拿的糖种类不重复就可以了。注意测试数据的边界,有负数和很大的数。class Solution {public: int distributeCandies(vector& candies) { int l = candies.size()/2; int result = 0; int i =原创 2017-06-07 10:32:33 · 390 阅读 · 0 评论 -
237. Delete Node in a Linked List的C++解法
想了好久都没看懂题目,感觉单向链表只给出当前节点的话是没有办法删除此节点的,然后看了题解,感觉不知道谁比较蠢。。。 class Solution {public: void deleteNode(ListNode* node) { node->val = node->next->val; node->next = node...原创 2017-06-07 11:18:35 · 291 阅读 · 0 评论 -
599. Minimum Index Sum of Two Lists的C++解法
主要思路还是一个一个找。一开始写了一个简单的双重循环的版本但是数据规模大的时候超时了,所以优化了一下算法:设一个门限值,只要当前找到的字符串索引之和小于门限就更新这个门限,同时list1在门限值之后的值都不查找了(因为肯定比当前结果大了)。注意门限最大值应该设成两倍的最大list长度,结果也可能不唯一所以每次替换的时候要clear盛放结果的容器。class Solution {publi原创 2017-06-08 15:46:35 · 357 阅读 · 0 评论 -
598. Range Addition II的C++解法
因为是从(0,0)开始更新,所以只要找到最小的横纵坐标就可以了。注意处理ops为空的情况。class Solution {public: int maxCount(int m, int n, vector>& ops) { int min1 = m; int min2 = n; for (int i = 0; i < ops.size(); i++) { if (op原创 2017-06-08 17:06:00 · 271 阅读 · 0 评论 -
217. Contains Duplicate的C++解法
使用哈希表会因为数据范围太大超时,最大的数据大概到了1200000005;只使用暴力比较也会超时。所以写了一个组合,数字个数少的时候暴力比较,多的时候用哈希表,经过多次测试让这两个算法覆盖整个测试数据即可。速度在前6%。class Solution {public: bool containsDuplicate(vector& nums) { if(nums.size()原创 2017-06-30 10:53:31 · 521 阅读 · 0 评论