leetcode
文章平均质量分 69
fenfenmiao
这个作者很懒,什么都没留下…
展开
-
Number of Boomerangs
这道题的思路不是很难,就是要挨个算距离,然后做一个表,用排列组合的A算所求的值。问题在于,这道题,可以说是时间换内存。由于平方的数很大,如果你在for的最外边用map,内存是不够的,所以要在第一个平方里面用,会造成一些时间上的重复,ab ba都要算class Solution {public: int numberOfBoomerangs(vector>& points) {转载 2017-03-16 23:15:25 · 287 阅读 · 0 评论 -
Balanced Binary Tree
这个麻烦在,对以一个结点为根的树,左右树都Balance,左右树的差小于1同时满足才行。第一种,每一个算Balance都要算到下面的height,然后复杂度O(N^2)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeN原创 2017-03-07 14:56:07 · 250 阅读 · 0 评论 -
Path Sum III
啊这个递归总是会加重或者少加,办法就是你写出来那个过程,就知道哪里重了哪里少加了......../** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) :原创 2017-03-08 21:13:29 · 211 阅读 · 0 评论 -
Lowest Common Ancestor of a Binary Search Tree
这是个BST,是有顺序的.......有顺序就好办了......./** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(N原创 2017-03-08 19:15:23 · 203 阅读 · 0 评论 -
Next Greater Element I
用遍历的办法,挨个比,效率比较低:class Solution {public: vector nextGreaterElement(vector& findNums, vector& nums) { int n=findNums.size(); int m=nums.size(); vector flag;原创 2017-02-25 17:39:16 · 241 阅读 · 0 评论 -
leetcode stack 155 225 232
easy的栈,155取最小的元素,用两个栈,第二个栈存当前的栈的最小元素,然后弹出的时候根据情况弹出元素:class MinStack {public: /** initialize your data structure here. */ MinStack() { } void push(int x) { s1.p原创 2017-02-25 16:24:03 · 355 阅读 · 0 评论 -
Search Insert Position
这个思路比较简单,用二分查找。但是有一个问题,也是平时的问题,简单的问题容易因为边界条件等等想复杂,这道题就是,其实可以先写出来最主要的主干,然后看看这个主干能否适应这个问题,像二分查找,主干就是while(low我的版本:class Solution {public: int searchInsert(vector& nums, int target) { in原创 2017-01-29 19:04:28 · 448 阅读 · 0 评论 -
(重点)Remove Linked List Elements和Delete Node in a Linked List
删除操作,**是可以不考虑head的特殊情况的:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution原创 2017-01-29 14:40:09 · 343 阅读 · 0 评论 -
Reverse Linked List
这道题是把链表倒过来......活久见递归自己搞对了......递归效果好,不会有重复:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * };原创 2017-01-29 15:20:24 · 185 阅读 · 0 评论 -
Intersection of Two Linked Lists
这道题找两个链表的交叉点,要点是找两个链表的长度差。找到长度差,然后去掉这个差两个链表一起走,就会相遇。有交叉点就在交叉点相遇,没有的话就是NULL。这个一个走到尾就到另一个的头结点的作用,就是把这个两个链表的差给去掉了。/** * Definition for singly-linked list. * struct ListNode { * int val; * L转载 2017-01-29 13:21:27 · 173 阅读 · 0 评论 -
回溯法和bitset Binary Watch
这个是在回溯法的标签里的。回溯法大致是这样,按照深度优先搜索,在解空间树里往前走,如果不行就回退,然后换一条路。在换路的同时剪去错枝,就是一种蛮力的有剪枝的遍历......于是我先用的回溯:class Solution {public: vector readBinaryWatch(int num) { vector re; vector bit(10原创 2017-03-28 10:38:38 · 473 阅读 · 0 评论 -
动态规划 House Robber;Best Time to Buy and Sell Stock
动态规划,可以看这个http://www.360doc.com/content/13/0601/00/8076359_289597587.shtml我理解的,就是如果一个方法用递归,你发现过程会有重复,比如斐波那契数列,a(n)=a(n-1)+a(n-2),然后就会出现每个被算n次的悲剧(3=1+2,5=2+3,8=3+5,算5的时候3被递归了,算8的时候,3被递归了,5又递归了3,这样往后算原创 2017-03-28 10:49:41 · 421 阅读 · 0 评论 -
Minimum Absolute Difference in BST && Find Mode in Binary Search Tree
这个的思路就是BST中序遍历,得到的就是从小到大排的顺序,然后依次算两个的差,就能得到最小值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : v转载 2017-03-11 18:34:31 · 216 阅读 · 0 评论 -
Find All Anagrams in a String
用一个窗口......hash表的活学活用......class Solution {public: vector findAnagrams(string s, string p) { vector pv(256,0),sv(256,0),re; if(s.size()<p.size()) return re; for(转载 2017-03-16 19:20:39 · 255 阅读 · 0 评论 -
Find the Difference
妈呀又是神奇的异或……虽然哈希也可以,然而跟异或比起来就不值一提了……class Solution {public: char findTheDifference(string s, string t) { char r=0; for(auto c:s) r^=c; for(auto c:t) r^=c; ret转载 2017-03-13 19:50:03 · 257 阅读 · 0 评论 -
Intersection of Two Arrays
这个思路比较简单,想说下语法点。unordered_map是键值对,键hash,unordered_set就是一个hash集合,只是key的集合,方便快速查找的。同时set是红黑树,所以有两个很好的特点,有序,没有重复,而且O(logN)的效率也很高。这里对nums1做了一个unordered_set,就用了没重复的特性。class Solution {public: vector转载 2017-03-13 19:25:09 · 269 阅读 · 0 评论 -
Word Pattern
这个hash的模式之前也用过,Isomorphic Strings这道题用过,就是搞两个表,对两个比较的模式,key塞字符串,值塞第一次出现的位置,然后两个表的字符串,如果是对应的,那么相应的key的值是一样的,如果不对应(模式不一样),那么相应的key的值就不一样。还有一个就是字符串有空格,怎样拆分,这里用了一个流的模式:class Solution {public: bool原创 2017-03-12 21:45:35 · 424 阅读 · 0 评论 -
Isomorphic Strings
哈希表,哈希的思想,不一定都要用unordered_map的....class Solution {public: bool isIsomorphic(string s, string t) { int Se[256]={0}; int Te[256]={0}; int n=s.length(); fo原创 2017-03-12 18:56:57 · 228 阅读 · 0 评论 -
Count Primes
啊,不用埃拉托斯特尼筛法,怎样都是time超了......具体筛法就是那个图,下面这段话是别处找的,能理解大致意思,但是有一点我理解的和他不一样,这个找素数应该是遍历中当前的下一个没被标记的就是素数,而不用全找完了再遍历一圈,看下面的代码就知道了。这道题给定一个非负数n,让我们求小于n的质数的个数,题目中给了充足的提示,解题方法就在第二个提示埃拉托斯特尼筛法Sieve of Era转载 2017-03-12 11:04:40 · 231 阅读 · 0 评论 -
Happy Number
第一种,用哈希,每次算完一个平方和去表里看一看,如果这个不是1还和表重了,那就不是:class Solution {public: bool isHappy(int n) { unordered_map Fi; while(n!=1) { int sum=0; while(n!=0)原创 2017-03-12 10:09:25 · 319 阅读 · 0 评论 -
Single Number
可以用hash表:class Solution {public: int singleNumber(vector& nums) { unordered_map re; for(int i=0;i<nums.size();i++) { if(re.find(nums[i])==re.end())原创 2017-03-12 09:25:30 · 243 阅读 · 0 评论 -
Battleships in a Board
连着的横着的或者竖着的x就是一艘船,每两艘不会连着,比如它给的x . . x. . . x. . . x这个左面的x是一艘,右面的三个x是一艘,然后. . .xxxxx. . .x这样的不会给你,因为中间的左3个x和右边的竖三个x挨起来了,它不会给你挨起来的船。所以一种比较简单的办法,数一共多少个船头,一个x,是船头的话,它的左边和上边要不是原创 2017-03-11 20:20:55 · 247 阅读 · 0 评论 -
Linked List Cycle
判断链表有没有环,可以用追击问题,一个走两步,一个走一步,如果能碰一起就是有环。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */原创 2017-01-28 20:00:11 · 181 阅读 · 0 评论 -
Remove Duplicates from Sorted List
链表问题如果没编过,查代码一定有哪里出现指针飞了,这个地方是null然而还操作....../** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }原创 2017-01-28 19:29:55 · 161 阅读 · 0 评论 -
Merge Sorted Array
从后往前比,因为是往nums1里面插入,所以while循环nums2而不是nums1,当循环结束,nums1就不用动了:class Solution {public: void merge(vector& nums1, int m, vector& nums2, int n) { int i=m-1; int j=n-1;原创 2017-01-25 21:18:46 · 153 阅读 · 0 评论 -
双指针Remove Element和Remove Duplicates from Sorted Array
双指针是一种思想,这里的指针不要单纯理解为*...只是一种定位的意思....双指针可以是快慢指针,比如这两个,也可以是分别在前后的,恩,这种也还没遇到.....这里的两道题都是快慢的指针,比如Remove Duplicates from Sorted Array,去掉重复的元素,一个用来遍历,就是走的快的,还有一个是指向当前的更新的位置,如果快指针是新元素,慢指针就更新然后往前移一个,如果原创 2016-12-19 11:11:08 · 282 阅读 · 0 评论 -
?不是很理解的分治法Majority Element
class Solution {public: int majorityElement(vector& nums) { return majority(nums, 0, nums.size() - 1); }private: int majority(vector& nums, int left, int right) { if (lef转载 2016-12-23 20:40:43 · 861 阅读 · 0 评论 -
Major Element
一道题的解法千千万,恩.....先说几种效率高的(时间短)。第一种叫Moore Voting Algorithm,虽然我不懂为什么这么叫,意思就是这道题让你找出现次数大于n/2向下取整的,初始化count=0,然后从头开始遍历,如果当前count=0,那么major暂时等于现在遍历的元素,count++,如果count大于0,major和遍历的元素相等,count++,如果不相等,count-转载 2016-12-23 11:40:36 · 571 阅读 · 0 评论 -
Swap Nodes in Pairs
这道题看懂下面的代码,p是指向指针的指针,p---->head,*p=b有点难理解,其实意思就是改变p所指向的那个值为b,也就是第一次while的时候head就等于b了。可以这样想,int i=0;int *p=&i;*p=4;所以i就等于4了。i只是p所指向的值的一个名字。上面的head同理。/** * Definition for singly-linked list. * str转载 2016-12-21 21:55:01 · 244 阅读 · 0 评论 -
Merge Two Sorted Lists
这道题不难,但是先贴一个脑残代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {publi原创 2016-12-21 10:59:09 · 196 阅读 · 0 评论 -
String to Integer (atoi)
这道题就是一通考虑特殊情况,还有注意溢出,-2^32~2^32-1是这个范围,注意边界的处理,里面算得时候是按照正数的,所以"-2147483648"会判成溢出了,所以判断溢出了就拿出来.....class Solution {public: int myAtoi(string str) { long long re=0; int i=0;原创 2016-12-16 17:28:25 · 220 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
最开始不知道可以用哈希表这种神奇的东西,结果用的队列......复杂度很高但是也过了:class Solution {public: int lengthOfLongestSubstring(string s) { queue a1,temp; int len=0,lentemp=0,lena1=0; bool flag=false;原创 2016-12-16 16:18:03 · 230 阅读 · 0 评论 -
Reverse Integer和Palindrome Number
这个比较简单,但是要注意,溢出判断,用INT_MAX和INT_MIN:class Solution {public: int reverse(int x) { long long re=0; while(x!=0) { re=re*10+(x-x/10*10); x=x/10; } return (re>INT_MIN原创 2016-12-15 23:27:36 · 263 阅读 · 0 评论 -
ZigZag Conversion
第一种办法,简单粗暴的排着算,要求几行就设几个vector,然后就按照规则行数先加后减,依次加到vector里:class Solution {public: string convert(string s, int numRows) { vector a[numRows]; string str; int n=s.size();原创 2016-12-15 23:23:16 · 197 阅读 · 0 评论 -
Maximum Subarray
这道题很好想的是遍历,二重循环O(n^2)复杂度,挨个算每种情况,找最大的,然而这样子会超时间.....比较典型的解法,分治法,就是一个数组,求最大的连着几个的和,可能在左边,也可能在右边,还可能在中间,所以用分治法递归,。递归的药店要点,确定基准,向着基准推进,所有的递归都能运行,不在在不同的递归里不能进行同样的重复的运算。class Solution {public: int转载 2016-12-26 16:29:22 · 208 阅读 · 0 评论 -
First Bad Version
比较简单,二分查找,临界点一直在左面是好的右面是坏的的区间里。注意取mid的时候,如果用(left+right)/2,有可能溢出,但是你用left+(righ-left)/2,就没事了。// Forward declaration of isBadVersion API.bool isBadVersion(int version);class Solution {public:原创 2016-12-26 17:23:35 · 221 阅读 · 0 评论 -
Longest Common Prefix
没什么好办法就是遍历,还有永远的怎么搞没有元素和一个元素的时候.....class Solution {public: string longestCommonPrefix(vector& strs) { string re=""; int n=strs.size(); if(n==0) { re原创 2016-12-26 22:46:45 · 201 阅读 · 0 评论 -
Plus One
比较简单的是弄个进位,每一个都是加进位,然后遍历:class Solution {public: vector plusOne(vector& digits) { int in=1; int n=digits.size(); for(int i=n-1;i>=0;i--) { int temp=d原创 2017-01-25 20:38:43 · 341 阅读 · 0 评论 -
Convert Sorted Array to Binary Search Tree
递归......注意看一下这里面指针,用new。new返回的是指向创建的对象的指针。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val原创 2017-03-01 23:13:10 · 216 阅读 · 0 评论 -
Binary Tree Level Order Traversal II
层序遍历,先用一个栈把结点分层塞进去,再逐个出栈:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), ri原创 2017-03-01 18:58:16 · 202 阅读 · 0 评论