LeetCode
littlestream9527
Hew out of the mountain of despair a stone of hope!
展开
-
LeetCode String to Integer (atoi)
剑指offer倒数第二道题,用long long 来存整数才能判断相乘是否溢出#include "stdafx.h"#include #include using namespace std;int atoi(const char *str) { int i,signal=1; long long sum=0; if (str==NULL||*str==0) { retur原创 2013-12-02 19:27:35 · 589 阅读 · 0 评论 -
LeetCode Reverse Integer
主要是考虑溢出,主要问题也是解决溢出,判断溢出。自己写个带参数(引用参数)的,不被识别,把参数去了确AC了。自己知道就行了。int reverse(int x,bool &flag) {//flag means if the result is overflow int signal=1; if (x<0) { signal=-1; } int temp,ret=0,newv=0原创 2013-12-01 21:21:02 · 1094 阅读 · 0 评论 -
LeetCode Longest Substring Without Repeating Characters
bool isRepeated(string s){ vector vec; for (int i=0;i<s.length();i++) { if (vec.empty()) { vec.push_back(s[i]); } else { vector::iterator iter=vec.end(); //iter = vec.find(s[i])原创 2013-11-30 10:32:35 · 541 阅读 · 0 评论 -
LeetCode Roman to Integer
int romanToInt(string s) { map mp; mp['I']=1; mp['V']=5; mp['X']=10; mp['L']=50; mp['C']=100; mp['D']=500; mp['M']=1000; int ret=0; //int unit=1000; int i=0; while(i<s.length()) { if (s原创 2013-12-08 09:52:35 · 505 阅读 · 0 评论 -
LeetCode ZigZag Conversion
这题主要是读明白题意。本来打算用二维数组存储,然后对数组中元素赋值,通过横纵索引的规律一个一个的输出。所以把图画了下来,分别是row为2,3,4时的情况,后来一看似乎有规律可循,即所要的转化串与原始串之间有一定的对应规律,想了想,试了试,测试了一下边界条件,一下子就出来了,感觉自己的编程能力提高了,有木有?string convert(string s, int nRows) { int i原创 2013-12-01 16:39:59 · 646 阅读 · 0 评论 -
LeetCode Longest Palindromic Substring
第一次提交,,直接处理,时间为O(n三次方),时间限制,不通过。bool dist(string s,int i,int j){ while(i<j) { if (s[i]!=s[j]) { return false; } i++;j--; } return true;}string longestPalindrome(string s) { int st原创 2013-12-01 12:00:02 · 707 阅读 · 0 评论 -
LeetCode Add Two Numbers
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { if (l1==NULL) { return l2; } if (l2==NULL) { return l1; } ListNode *p1=l1,*p2=l2; ListNode *p3=NULL,*q=NULL,*head=NULL; bool flag=fal原创 2013-11-30 11:20:47 · 480 阅读 · 0 评论 -
LeetCode Two Sum
自己写的,运行28msvector twoSum(vector &numbers, int target) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. int i,j;原创 2013-11-28 21:09:33 · 608 阅读 · 0 评论 -
LeetCode Integer to Roman
个位数举例I, 1 】II, 2】 III, 3】 IV, 4 】V, 5 】VI, 6】 VII, 7】 VIII,8 】IX, 9 ·十位数举例 X, 10】 XI, 11 】XII, 12】 XIII, 13】 XIV, 14】 XV, 15 】XVI, 16 】XVII, 17 】XVIII, 18】 XIX, 19】 XX, 20】 XXI, 21 】XXII, 22 】XX原创 2013-12-07 21:42:43 · 629 阅读 · 0 评论 -
LeetCode Longest Common Prefix
// LeetCode_LongestCommonPrefix.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;string longestCommonPrefix(vector &strs) { int strslen = strs.size();原创 2013-12-08 10:11:07 · 562 阅读 · 0 评论 -
LeetCode Container With Most Water
笨!笨!笨!int maxArea(vector &height) { int n=height.size(); int sum=0; for (int i=1;i<=n;i++) { for (int j=i+1;j<=n;j++) { if ((j-i)*min(height[i-1],height[j-1])>sum) { sum = (j-i)*mi原创 2013-12-06 21:41:14 · 582 阅读 · 0 评论 -
LeetCode Median of Two Sorted Arrays
http://blog.csdn.net/zcsylj/article/details/6802062这篇博客上的想法是错的。虽说在优化思想上是对的,但其对median的理解就是错的,判断时要判断中位数是否想等,而不是只是简单的除2.我的思路是对的,但是这么做的话,很复杂。因为用中位数来判断是否相等,还要对中位数取整用作索引,最麻烦的是要不断改两个数组的起始索引和结束索引。下面的方法,从最转载 2013-11-29 21:07:45 · 552 阅读 · 0 评论 -
LeetCode 3Sum Closest
思想还是先排序。之后,首先选择一个数,然后判断另两个数的和与选择的数对应的最接近值。因为排序了,所以找最接近值时时间为O(n),整体时间为N方。若是直接处理为N的三次方可能时间会限制。// LeetCode_3SumClosest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using n原创 2013-12-08 17:13:48 · 578 阅读 · 0 评论 -
LeetCode 4Sum
如果说只是n的三次方,方法和上题一样的话,那么这题也什么太大意思,下面的方法就是n的三次方,也通过了。不过不知道有没有更好的。// LeetCode_4Sum.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;vector > fourSum(vect原创 2013-12-08 20:13:25 · 2215 阅读 · 1 评论 -
LeetCode 3Sum
想法:先排序,先考虑0的情况(三个以上连续的0),再考虑绝对值相同的数值,再考虑不包括0的情况,两个正数和为一个负数,或者两个负数的和为一个正数。这样的结果会包含重复的元素,最后再去掉重复的。提交时自己写的针对容器的容器去重和排序在本地VS2008下编译通过,但是提交不通过,去掉自己的比较函数,直接去重居然也好使,通过了。// LeetCode_3Sum.cpp : 定义控制台应用程序的入口点原创 2013-12-08 14:49:21 · 589 阅读 · 0 评论 -
LeetCode Remove Nth Node From End of List
没在本地测试,一次提交直接通过。ListNode *removeNthFromEnd(ListNode *head, int n) { if (head == NULL) return NULL; if (head->next == NULL && n == 1) { delete head; return NULL; } ListNode *p,*q; p = q =原创 2013-12-09 19:11:51 · 556 阅读 · 0 评论 -
LeetCode Generate Parentheses
这题以前做过,用递归做的,写了个递归程序也算是调了一会儿,通了。想了想是不是能不用递归呢?一个多小时吧,答案是肯定的。void generate(vector &ret,vector &path,int left,int right,int n){ if (left<n) { path.push_back("("); left++; generate(ret,path,lef原创 2013-12-09 21:35:58 · 739 阅读 · 0 评论 -
LeetCode Letter Combinations of a Phone Number
这题貌似简单,我却想了很久,感觉不太容易上手,要是面试时肯定不能一下子就写出来。我的思路:后面的数字每到最大长度,前面的就进位(即前面位加一,后面的位变为0)知道最前面的位到达它的长度,此时结束。// LeetCode_LetterPhoneNumber.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #inclu原创 2013-12-08 21:32:14 · 1656 阅读 · 0 评论 -
LeetCode Valid Parentheses
这题和最小括号匹配不同,直接用栈就行,不用动态规划。感觉有点简单了。bool isMatch(char c1,char c2){ if ((c1=='(' && c2 == ')')||(c1=='[' && c2 == ']')||(c1=='{' && c2 == '}')) { return true; } else return false;}bool isVal原创 2013-12-09 19:34:03 · 623 阅读 · 0 评论 -
LeetCode Palindrome Number
这题上次回家微策略的电面题,也是当时写代码,当时思路混乱没立刻写出来,后来好像说了说想法,想法是对的。忘了是不是当初死在这题上了,现在都无所谓了。#include "stdafx.h"#include using namespace std;bool isPalindrome(int x) { if (x<0) { return false; } int highbit=1原创 2013-12-02 20:15:07 · 551 阅读 · 0 评论 -
LeetCode Swap Nodes in Pairs
ListNode *swapPairs(ListNode *head) { ListNode *head2=NULL,*p=NULL,*q=NULL,*s=NULL; p = head; if (p==NULL||p->next==NULL) return p; while(p!=NULL&&p->next!=NULL) { s = p->next; p->next = s-原创 2013-12-10 18:18:46 · 530 阅读 · 0 评论 -
LeetCode Merge k Sorted Lists
// LeetCode_MergekSortedLists.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;struct ListNode { int val; ListNode *next; ListNode(int x) : val(x),原创 2013-12-10 16:31:48 · 502 阅读 · 0 评论 -
LeetCode Reverse Nodes in k-Group
这题好像是美团的一道笔试题,当初记得一种好的方法使用栈,但是这要复制元素,本题有了限制;之后我花了两个小时想找递归的算法,后来还是没找到,下面的是最普通的那种做法,也是调了一阵子才弄出来的。void reverse(ListNode **s,ListNode**e){ ListNode *p=*s,*q=NULL,*r=NULL; (*e)->next = NULL;//this is原创 2013-12-11 21:04:46 · 536 阅读 · 0 评论 -
LeetCode Remove Duplicates from Sorted Array
简单的一道小题,考虑不全提交了好几次。int removeDuplicates(int A[], int n) { int i=0,j=0; if (n==0) return 0; while(i+1<n&&A[i]!=A[i+1]) { i++; j++; } if (i==n-1) return n; //i++; j++; while(j<n) {原创 2013-12-11 21:42:24 · 517 阅读 · 0 评论 -
LeetCode Remove Element
int removeElement(int A[], int n, int elem) { int i=0,j=0; while(j<n&&A[j]!=elem) { i++; j++; } if (j==n) return n; while(j<n) { while(j<n&&A[j]==elem) j++; if (j<n) { A[i++]=A[j原创 2013-12-11 21:53:48 · 545 阅读 · 0 评论 -
LeetCode Implement strStr()
这题就是KMP算法,看了几遍还是没能想起来,又拿起书看了看,写了程序,bug不少,调了好久,通了。char *strStr(char *haystack, char *needle) { if (haystack==NULL||needle==NULL) { return NULL; } int lenneedle=0; char *p=needle; while(*p) {原创 2013-12-12 21:10:00 · 549 阅读 · 0 评论 -
LeetCode Divide Two Integers
以前听过这题,也思考过,但到自己做时问题才暴漏出来,最终还是提交别人的通过的,哎,后悔呀,在思考一点是不是我也可以想到呢(我有无数次这样的悔恨,放弃太早了)?下面的是我的方法,也是用了移位运算,时间复杂度也是lg(n)还是没通过,可见leetCode这道题还是挺严的,思路是这样的:先判断结果集所在的区间,然后二分查找,直到找到结果。如下:int divide(int dividend, i原创 2013-12-13 10:25:22 · 573 阅读 · 0 评论 -
LeetCode Pow(x, n)
不得不说我又输了,第一次提交失败了,想的太简单,忘了负数和0 的情况。这题就这一点,一旦知道自己原来错了,这题就没有什么可以拟补失误的机会了。// Pow(x, n).cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;double pow(double x, int ni) { doubl原创 2013-12-28 19:17:50 · 532 阅读 · 0 评论 -
LeetCode Anagrams
这题关键是明白题意,题意是说去除那些在给定的数组里没有其anagrams的那些值,凡是有anagram的搜输出,甚至顺序都不重要,之后感觉没什么了。vector anagrams(vector &strs) { int lenstr = strs.size(); vector ret; if(lenstr == 0) return ret; vector strtemp(strs)原创 2013-12-28 19:00:20 · 587 阅读 · 0 评论 -
N-Queens II
按照 I 中的做法只是把返回结果变了一下,提交出现超时,这有点意思。想了想,也不能不递归呀,于是做了一些优化,既是在每次求下一值之前(即进行递归之前)先判断当前的布局是否合理,这样就能大大减少递归的次数,以十次为例,这样的提升一下子就能感觉到。bool isvalidEachLine(int *arr,int n,int j){ for (int i=0;i<j;i++) { if原创 2013-12-29 19:19:15 · 880 阅读 · 0 评论 -
LeetCode N-Queens
还记得第一次遇见这题时,本科刚学数据结构时,有个周末一人拎个笔记本在林大二教调了整整一小天,那是八皇后的问题,只记得第一次调通的兴奋,至于内容全忘了。这题刚开始理解错了,以为皇后只是横竖能走,斜着不能走,所以刚开始的思路是用一个一维数组,下标是皇后所在的行,值是所在的列,这样类似求全排列的方式,应该是有多少种全排列就有多少种布局的方式,当然这是错的,不过思路仍然可以用,只是在放入解的时候多判断一下原创 2013-12-29 10:31:31 · 562 阅读 · 0 评论 -
LeetCode Maximum Subarray
面试题,做过无数次了,不废话。int maxSubArray(int A[], int n) { int curmax = A[0]; int max = curmax; for (int i=1;i<n;i++) { if (curmax + A[i]>A[i]) curmax = curmax + A[i]; else curmax = A[i]; if (原创 2013-12-29 19:38:50 · 572 阅读 · 0 评论 -
LeetCode Spiral Matrix
记忆清晰呀,高德笔试题,可惜第一次还是提交失败,考虑不周到所致。就是在while里不能只判断横排或者竖排, 必须横竖都判断。// LeetCode_MaximumSubarray.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;int maxSubArray(int A原创 2013-12-29 20:46:56 · 526 阅读 · 0 评论 -
LeetCode Jump Game
有jump game 2 http://oj.leetcode.com/problems/jump-game-ii/ 比简单多了,只是需要考虑用最小的步数就行了,找到结果尽快返回,也就是优化。我的思想是:设置一个能达到的最远点,首先判断当前点能不能到达,然后看能都更新最远点,如果最远点超过了最后的索引,直接返回真。如下:bool canJump(int A[], int n) { if原创 2013-12-29 21:02:26 · 602 阅读 · 0 评论 -
LeetCode Merge Intervals
这题最头疼的是如何给vector中的结构体排序,重载sort中自己的编写的排序函数不行,重载小于操作符不行,后来看人家的,是重载结构体中的()操作符的,可以了,之后没什么,不知道有没有O(n)的方法// LeetCode_MergeIntervals.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #includ原创 2013-12-29 22:19:20 · 608 阅读 · 0 评论 -
LeetCode Next Permutation
还记得怎么求字符串的排列吗?void Permutation(vector &num,int i){ if (i==num.size()) { for (int k=0;k<num.size();k++) { cout<<num[k]<<" "; } cout<<endl; return ; } for (int j=i;j<num.size();j++)原创 2013-12-16 16:43:47 · 600 阅读 · 0 评论 -
LeetCode Spiral Matrix II
怎么做了好几个题都没什么含金量呢,刷的感觉vector > generateMatrix(int n) { vector > ret; if (n==0) { return ret; } vector temp; for (int i=0;i<n;i++) { temp.clear(); for (int j=0;j<n;j++) { temp.push_b原创 2013-12-30 19:38:54 · 585 阅读 · 0 评论 -
LeetCode Insert Interval
同合并一样,没什么新鲜的东西vector insert(vector &intervals, Interval newInterval) { vector::iterator iter = intervals.begin(); while(iter!=intervals.end()&&iter->start<newInterval.start) { iter++; } inte原创 2013-12-30 18:49:41 · 604 阅读 · 0 评论 -
LeetCode Length of Last Word
这题就是多想一会呗,感觉没什么,但要是一次提交就过也不容易。int lengthOfLastWord(const char *s) { const char *lastspace = s; if(!*s) return 0; while(*lastspace) lastspace++; int sum = 0; lastspace--; while(lastspace!=s原创 2013-12-30 19:17:56 · 515 阅读 · 0 评论 -
LeetCode Search in Rotated Sorted Array
这题和剑指offer上的旋转数组的最小值类似,此题应该比那题还简单,因为没有重复的元素。int bisearch(int *arr,int start,int end,int value){ while(start<=end) { int mid = (start + end)>>1; if (arr[mid]==value) { return mid; } e原创 2013-12-17 15:16:24 · 462 阅读 · 0 评论