leetcode-java題解(每天更新),leetcode-java題解

來源:互聯網
上載者:User

leetcode-java題解(每天更新),leetcode-java題解

說明:選用java,重在體會,效能不是最優。歡迎轉載:http://www.ming-yue.cn/leetcode-java-solutions/。

先給出一個leetcode的已有答案,為什麼上來直接給出答案,因為這個好多答案寫的都非常簡潔,不太易懂,還是建議先自己做,答案只是參考http://www.ninechapter.com/solutions/。

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。

我先用第一種容易理解的方式AC,答案比較簡單:

//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就是參考的九章裡面的解法,讀懂然後過一段時間默寫。

3,https://leetcode.com/problems/longest-substring-without-repeating-characters/,題目大意就是找出一個字串中不重複的最長子串。

這個比較簡單,想清楚關鍵一點就是判斷出重複後,從重複字元的下一索引繼續開始,不要遺漏。

代碼如下:

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,等待更新

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.