leetcode-java題解(天天更新)

說明:選用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%B8spa

我先用第一種容易理解的方式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,等待更新

相關文章
相關標籤/搜索