leetcode
含笑饮毒酒_
这个作者很懒,什么都没留下…
展开
-
leetcode 14. Longest Common Prefix
遇到的几个问题:问题1:二维字符数组或者说字符串数组不能这样初始化:char **strs={“abc",abd","abv"};而应该这样:char *strs[]={“abc",abd","abv"};问题二:考虑strsSize=0的情况。char* longestCommonPrefix(char **strs, int strsSize) { ch原创 2016-05-29 19:28:00 · 354 阅读 · 0 评论 -
leetcode 36. Valid Sudoku
直接暴力判断就可以啦bool isValidSudoku(char** board, int boardRowSize, int boardColSize) { if(boardRowSize!=9||boardColSize!=9) return false; int i,j,m,n,temp; for(i=0;i<9;i++) {原创 2016-09-26 21:38:16 · 247 阅读 · 0 评论 -
leetcode 35. Search Insert Position
水题一道int searchInsert(int* nums, int numsSize, int target) { int i; for(i=0;i<numsSize;i++) { if(nums[i]<target) ; else return i; }原创 2016-09-26 20:09:39 · 311 阅读 · 0 评论 -
leetcode 34. Search for a Range
很简单的一道题,但是一次性还是写不对,还是得多练啊。int* searchRange(int* nums, int numsSize, int target, int* returnSize) { int i; int left,right; int *ret; ret=(int *)malloc(sizeof(int)*2); for(i=0;i<nu原创 2016-09-26 19:18:22 · 205 阅读 · 0 评论 -
leetcode 33. Search in Rotated Sorted Array(二分查找)
只要找到枢轴,在左边或者右边查找target,因为是有序的,所以使用二分查找,这里实现了递归和非递归两种二分查找:/*int binarySearch(int *nums,int left,int right,int target) //递归的{ int mid; if(left>=right) { if(nums[left]==targe原创 2016-09-25 20:01:22 · 339 阅读 · 0 评论 -
leetcode 26. Remove Duplicates from Sorted Array
比较简单,直接放代码int removeDuplicates(int* nums, int numsSize) { int i; int len,temp; len=0; for(i=0;i<numsSize;i++) { if(i==0) { temp=nums[0]; l原创 2016-08-27 10:24:24 · 600 阅读 · 0 评论 -
leetcode 25. Reverse Nodes in k-Group
以k个节点为一组,保存在一个数组中,重新调整各个节点的next,首先默认已更新序列的最后一个指向未更新序列的第一个,例如【1->2->3->4->5】,k=2,先调整为2->1->3->4->5,当下一组正好是k个时,上一组的最后一个指向下一组的末尾,更新为2->1->4->3->5,否则就不更新,最后得到2->1->4->3->5。struct ListNode* reverseKGroup原创 2016-08-27 09:58:58 · 346 阅读 · 0 评论 -
leetcode 24. Swap Nodes in Pairs
比较简单,直接放代码struct ListNode* swapPairs(struct ListNode* head) { struct ListNode *pointer1, *pointer2; int temp; if(head==NULL) return NULL; else { pointer1=head;原创 2016-08-26 20:13:00 · 411 阅读 · 0 评论 -
leetcode 23. Merge k Sorted Lists
递归地调用21题两个链表归并排序来实现多个链表的归并排序。 struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode* pointer1=l1; struct ListNode* pointer2=l2; struct ListNode*原创 2016-08-26 19:48:39 · 467 阅读 · 0 评论 -
LeetCode 39. Combination Sum
考点:回溯,递归Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.The same repeated number may be chosen from C原创 2016-11-08 09:15:22 · 299 阅读 · 0 评论 -
leetcode 40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.Each number in C may only be used once in the combina原创 2016-11-08 09:20:47 · 233 阅读 · 0 评论 -
leetcode 53. Maximum Subarray(分治,递归)
找到中间位置,所求子串不是在中间位置的左边,就是右边,还有中间位置两边。中间位置左边右边的和最大的子串可以递归地求得,再求中间位置往左挨个加的最大和以及中间位置往右挨个数的最大和,这两个和就是子串跨越中间位置时的最大和;这三个最大和中的最大值就是所求最大值。这道题好像在剑指offer见过额package leetcode53MaximumSubarray;import java.u原创 2016-12-30 09:22:06 · 1270 阅读 · 2 评论 -
leetcode 58. Length of Last Word(easy)
注意最后一个单词后边可能会有若干个空格的情况。这些简单题就是要注意特殊情况的处理。public class Solution { public int lengthOfLastWord(String s) { int len = s.length(); int count = 0; int i; int flag原创 2017-01-06 09:54:33 · 250 阅读 · 0 评论 -
leetcode 55. Jump Game
参考了http://www.cnblogs.com/zichi/p/4808025.html遍历数组,不断寻找能到达的最右端的位置,直到下标比最右端位置大为止。最后判断是否能到达最后一个位置。public class Solution { /* * public boolean canJump(int[] nums) { int i;原创 2017-01-06 09:30:29 · 259 阅读 · 0 评论 -
50. Pow(x, n) 求指数
首先注意n为Integer.MIN_VALUE的情况,取反的时候取不到它的相反数。使用库函数可以AC;不使用库函数自己写指数运算的过程要用递归的办法降低时间复杂度,在正负的情况中按奇数偶数分情况讨论。package leetcode50power;public class Solution { /* double myPow(double x, int n) {原创 2016-12-28 09:52:52 · 361 阅读 · 0 评论 -
leetcode 49. Group Anagrams(哈希,字典序)
题目大意:把一个字符串数组按字母组成的不同分到几个字符串数组,把每个字符串数组按字典序排序解题方法:先用HashMap类对字符串数组哈希,再把每个字符串数组进行字典序排序要 点:HashMap类的使用Arrays.sort(chars); 一个char[]的字典序排序Collections.sort(res); 一个字符串数组的字典序排序pac原创 2016-12-26 09:27:23 · 436 阅读 · 0 评论 -
leetcode 54 54. Spiral Matrix(矩阵顺时针绕圈输出)
思路:我是开辟了一个和原矩阵同样大小的矩阵temp来存放是否输出过的标志位,然后按照向右,向左,向上,向下的顺时针顺序来挨个输出,虽然空间复杂度大了一点,但是好处是思路比较简单,不容易错误。据说《剑指offer》上有这道题或者类似的题,带我看了剑指offer回来补充补充。import java.util.ArrayList;import java.util.Lis原创 2017-01-02 09:21:16 · 470 阅读 · 0 评论 -
leetcode 43. Multiply Strings
按照笔算的算法即可package leetcode43_3;class Solution { public String add(String num1, String num2) { String res=null; String temp=null; int len1=num1.length(); i原创 2016-11-18 09:51:19 · 218 阅读 · 0 评论 -
leetcode 38. Count and Say
PS.再也不想强迫症一样地挨着做了,以后只做简单和中的难度的,毕竟时间不多了。这道题思路很简单,但是怎么把思路转化成代码是个问题,总是很难一次性写对,总是调好几次才能写对,问题还是结题思路不清晰,考虑不全面。char* countAndSay(int n) { char *ret; ret=(char *)malloc(sizeof(char)*10原创 2016-10-03 20:26:58 · 205 阅读 · 0 评论 -
leetcode 32. Longest Valid Parentheses
leetcode 32. Longest Valid Parentheses算法就是从左向右扫描,遇到左括号就入栈,遇到右括号有三种情况:1.栈顶是左括号,那么用2取代那个左括号,这时如果栈顶下边是个数字,就要加上这个二;2.栈顶是数字,数字下边是个左括号,也就是"(数字)"的情况,用数字+2代替左括号,栈顶下降。再向前检查看是不是数字,是数字就合并。3.栈顶是数字,数字下边是(。直接将)入栈。原创 2016-09-17 20:41:44 · 552 阅读 · 0 评论 -
leetcode 31. Next Permutation
从numsSize-2的位置开始向前,对于每一个该position的数,从numsSize-1到position+1找到一个比nums[position]大的数,并且调换位置,这时候从position+1开始的数就是逆序排列了,这是我找到的规律。把这段逆序序列调成正序序列,就得到了想要的结果。如果每个数都找不到后边的比它大的数,说明整个序列是逆序的,调成正序即可。#include #incl原创 2016-09-16 18:42:26 · 229 阅读 · 0 评论 -
leetcode 16. 3Sum Closest
这道题和上一题很相似,也是i从1到numsSize-2遍历,nums[i]作为中间的数,j k从0和numsSize-2向i靠拢,如果nums[i]+nums[j]+nums[k]-target>0,k--,如果nums[i]+nums[j]+nums[k]-targetint quickSort(int *nums,int numSize){ int i,j,key,temp,flag;原创 2016-06-03 17:10:58 · 363 阅读 · 0 评论 -
leetcode 15. 3Sum
思路1:首先用了比较笨的方法,三层循环遍历所有可能,把得到的每种组合的三个数排序,再遍历当前已经得到的结果看有没有重复的,没有就加入结果集。结果Accepted,但是Runtime竟然达到了300多毫秒。我靠,真实够笨的。。。思路2:首先用快速排序把nums[]排序,从而保证将来的结果有序。i从1到numsSize-2遍历,nums[i]作为所遍历项的中间那个数,j k分别从0和numsSiz原创 2016-06-03 16:51:20 · 335 阅读 · 0 评论 -
leetcode 12. Integer to Roman
Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.从千位到各位,把每一位数对应的罗马数字字符串连接即可。char* intToRoman(int num) { char *base[4][10] ={"",原创 2016-05-19 19:46:53 · 231 阅读 · 0 评论 -
leetcode 11. Container With Most Water
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Fin原创 2016-05-19 00:19:36 · 343 阅读 · 0 评论 -
leetcode 10. Regular Expression Matching
这道题非递归会很复杂,我使用了递归的方法来解决这个问题。bool isMatch(char* s, char* p) { int len_s,len_p; int i; len_s=strlen(s); len_p=strlen(p); if(s[0]=='\0'&&p[0]=='\0') return true; if(p[0]原创 2016-05-18 16:58:39 · 351 阅读 · 0 评论 -
leetcode 9. Palindrome Number
只需要注意负数不是回文数bool isPalindrome(int x) { int len=1; int i; int temp=x; if(x==0) return true; if(x<0) return false; while((temp=temp/10)!=0) len++; i原创 2016-05-17 15:50:08 · 321 阅读 · 0 评论 -
Leetcode 8. String to Integer (atoi)
这道题的规则怪怪的,尝试了几次才搞定,主要注意超过int范围时输出最大的int数,而不是输出0;遇到非法字符输出非法字符前面提取到的数字。int myAtoi(char* str) { int len; int i; int flag; double res=0; len=strlen(str); for(i=0;i<len;i++)原创 2016-05-17 15:15:51 · 325 阅读 · 0 评论 -
leetcode 13. Roman to Integer
根据罗马数字的规则,从右往左读字符串,保存读到的最大的字符对应的数字,如果新读到的数小于这个数就减之,否则就加之。int charToInt(char c){ int num = 0; switch (c) { case 'I': num = 1; break; case 'V':原创 2016-05-28 20:18:38 · 218 阅读 · 0 评论 -
leetcode 18. 4Sum
这道题和前面的3 sum那道题很相似,也可以用相似的办法解决,排序后,先两层循环前面的两个数,后面的两个数从两边往中间逼近。int quickSort(int *nums,int numSize){ int i,j,key,temp,flag; key=nums[0]; i=0; flag=0; j=numSize-1; if(numSize<=1) return 0; w原创 2016-06-09 10:41:23 · 298 阅读 · 0 评论 -
leetcode 19. Remove Nth Node From End of List
先遍历统计链表长度count,要删除的就是从前往后的第count-n+1个节点,只需要找到第count-n个节点,用pointer->next=pointer->next->next删除节点。另外添加对一些特殊情况的处理:只有1个节点和count==n。包括main函数以及添加节点函数的源代码如下:#include #include #include struct ListNode原创 2016-06-09 20:47:36 · 215 阅读 · 0 评论 -
leetcode 30. Substring with Concatenation of All Words
第一次写,就挨个字母判断,判断从该字母开始的每个单词是不是出现过,出现过就失败。但是提交后发现单词表可以有重复。修改成遇到出现过的单词也继续扫描单词表,但是超时了。发现需要对单词表做一个预处理,得到每一个单词在从当前位置以后出现的次数,当然相同的单词只有第一个的次数是有效的。然后对于某一个字母扫描单词表。扫描到一个单词就把单词的次数减1,正好全都减成0就匹配成功。int* findSubstr原创 2016-09-15 16:10:58 · 296 阅读 · 0 评论 -
leetcode 29. Divide Two Integers
把四种正负情况都按负数除以负数来处理(因为最小的负数的绝对值比最大的正数的绝对值大1),然后不断把除数左移一位,其实就是乘以2,直到小于当前被除数,这时2的(移位次数-1)次方就是结果绝对值的一部分记为A,被除数-除数*A作为下一次循环的当前被除数,继续按同样的办法计算,直到当前被除数大于除数(因为是负数),把结果的每一部分加起来就是结果的绝对值,再根据原始的符号异同决定结果正负。另外还需要把一些原创 2016-08-28 21:44:36 · 393 阅读 · 0 评论 -
leetcode 28. Implement strStr()
使用直接遍历的办法就可以ACint strStr(char* haystack, char* needle) { int i,k,lenHaystack,lenNeedle,flag; lenHaystack=strlen(haystack); lenNeedle=strlen(needle); flag=1; if(lenNeedle==0)原创 2016-08-27 11:01:41 · 420 阅读 · 0 评论 -
leetcode 27. Remove Element (EASY)
更加简单,直接放代码int removeElement(int* nums, int numsSize, int val) { int i; int len; len=0; for(i=0;i<numsSize;i++) { if(nums[i]!=val) nums[len++]=nums[i]; }原创 2016-08-27 10:30:31 · 429 阅读 · 0 评论 -
leetcode 22. Generate Parentheses
C语言实现原创 2016-06-11 22:07:00 · 439 阅读 · 1 评论 -
leetcode 21. Merge Two Sorted Lists
每个链表一个游标,把小的数插入结果就行了。#include #include #include struct ListNode* add(struct ListNode* l1,int num);struct ListNode* removeNthFromEnd(struct ListNode* head, int n);struct ListNode* mergeTwoLists原创 2016-06-10 15:55:04 · 388 阅读 · 0 评论 -
leetcode 17. Letter Combinations of a Phone Number
Given a digit string, return all possible letter combinations that the number could represent.A mapping of digit to letters (just like on the telephone buttons) is given below.Input:Digit st原创 2016-06-05 17:52:13 · 247 阅读 · 0 评论 -
leetcode 20. Valid Parentheses
利用栈可以很容易解决。bool isValid(char* s) { int len=strlen(s); int i,pointer; char m[1000]; int top=0; for(i=0;i<len;i++) { if(s[i]=='('||s[i]=='{'||s[i]=='[') m[t原创 2016-06-09 21:31:31 · 229 阅读 · 0 评论 -
leetcode 59. Spiral Matrix II
我在这里用了和leetcode 54 一样的思路开辟了一个和原矩阵同样大小的矩阵temp来存放是否输出过的标志位,然后按照向右,向左,向上,向下的顺时针顺序构造矩阵。下面是这两道题的代码:import java.util.ArrayList;import java.util.List;public class Solution { public List spir原创 2017-01-09 09:18:54 · 372 阅读 · 0 评论