說明:選用java,重在體會,性能不是最優。歡迎轉載:http://www.ming-yue.cn/leetcode-java-solutions/。html
先給出一個leetcode的已有答案,爲何上來直接給出答案,由於這個好多答案寫的都很是簡潔,不太易懂,仍是建議先本身作,答案只是參考http://www.ninechapter.com/solutions/。java
1,https://leetcode.com/problems/two-sum/,題目大意是給出一個無序的數組和一個目標值,假設數組裏有且只有兩個數相加和目標值相等,按索引由小到大輸出這兩個數字的索引,從1開始索引。數組
思路:既然題目假設有兩個數a,b確定相加獲得目標值c,那麼確定有c-a存在於數組中,因而問題轉化成了如何高效檢查一個數組中是否包含某個值,在這裏找到一些答案http://www.diguage.com/archives/112.html。因而採用先排序,而後用Arrays.binarySearch的方法,而後根據OJ提示的一些錯誤,修改幾下就行了。具體代碼以下,254ms,和九章以及其餘解題答案不太同樣。性能
import java.util.Arrays; public class Solution1 { public static int[] twoSum(int[] numbers, int target) { int[] num = numbers.clone(); Arrays.sort(num); int size = num.length; int[] answers = new int[2]; for(int i=0;i<size;i++) { if(Arrays.binarySearch(num, target-num[i])>0) { int count=0,index1 = 0,index2=0; for(int j=0;j<size;j++) { if(numbers[j]==num[i]||numbers[j]==target-num[i]) { count++; if(count==2) { index2=j; answers[0] = (index1<index2?index1:index2)+1; answers[1] = (index1>index2?index1:index2)+1; break; } else { index1=j; } } } } } return answers; } public static void main(String[] args) { int[] test = {-3,4,3,90}; int target = 0; int[] result = {0,0}; result = twoSum(test,target); System.out.println(result[0]+","+result[1]); } }
2,https://leetcode.com/problems/median-of-two-sorted-arrays/,題目大意是有兩個有序數組AB,長度mn,求出這兩個數組的中位數,log(m+n)。分兩種思路,一是先歸併成C,再求中位數;二是分別求出AB的中位數,利用二分查找找出最終結果,中位數的概念http://zh.wikipedia.org/wiki/%E4%B8%AD%E4%BD%8D%E6%95%B8。spa
我先用第一種容易理解的方式AC,答案比較簡單:code
//solution1:先歸併合併,再求中位數 public static double findMedianSortedArrays(int A[], int B[]) { int[] C= mergeSortSub(A, B); double result=0; int n=C.length; if(n%2==0) { double m1=0.5*n-1; double m2=0.5*n; result = 0.5*(C[(int) m1]+C[(int) m2]); }else { result = C[(int) Math.round(0.5*n-1)]; } return result; } private static int[] mergeSortSub(int[] arr1,int[] arr2){//歸併排序子程序 if(arr1.length==0) { return arr2; } if(arr2.length==0) { return arr1; } int[] result = new int[arr1.length+arr2.length]; int i = 0; int j = 0; int k = 0; while(true){ if(arr1[i] < arr2[j]){ result[k] = arr1[i]; if(++i>arr1.length-1){ break; } }else{ result[k] = arr2[j]; if(++j>arr2.length-1){ break; } } k++; } for(;i<arr1.length;i++){ result[++k] = arr1[i]; } for(;j<arr2.length;j++){ result[++k] = arr2[j]; } return result; } public static void main(String[] args) { int A[]={1,2,3,4}; int B[]={5,6,7,8}; double result = findMedianSortedArrays(A,B); System.out.println(result); }
答案2就是參考的九章裏面的解法,讀懂而後過一段時間默寫。orm
3,https://leetcode.com/problems/longest-substring-without-repeating-characters/,題目大意就是找出一個字符串中不重複的最長子串。htm
這個比較簡單,想清楚關鍵一點就是判斷出重複後,從重複字符的下一索引繼續開始,不要遺漏。排序
代碼以下:索引
public class Solution3 { public static int lengthOfLongestSubstring(String s) { int len = s.length(); if(len==0) { return 0; } String string = null; String subString = null; int maxLength = 0; for(int i=0;i<len;i++) { subString = String.valueOf(s.charAt(i)); if(i==0) { string = subString; subString = null; }else { if(!string.contains(subString)) { subString = string+subString; string = subString; if(string.length()>maxLength) { maxLength = string.length(); } subString = null; }else { int index = string.indexOf(subString); subString = string.substring(index+1)+subString; string = subString; if(string.length()>maxLength) { maxLength = string.length(); } subString = null; } } } return maxLength; } public static void main(String[] args) { String string = "dvdf"; int result = lengthOfLongestSubstring(string); System.out.println(result); } }
4,等待更新