leetcode刷題記錄1-5

1. 兩數之和
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。

示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/two-sum

暴力破解法:
(用時長,消耗內存少)

	public int[] twoSum(int[] nums, int target) {
        for(int i=0;i<nums.length;i++){
            for(int j=0;j<nums.length;j++){
                if(i!=j&&target-nums[i]==nums[j])
                    return new int [] {i,j};
            }
        }
        return null;
    }

哈希表法:
(用時短,消耗內存多,以空間換時間)

	public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            int y=target-nums[i];
            if(map.containsKey(y)){
                return new int[] {map.get(y),i};
            }            
            map.put(nums[i],i);
        }
        return null;
    }

2. 兩數相加
給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。
如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-two-numbers

這裏我被示例誤導了好幾次,事實上這兩個鏈表的長度並不固定,而且可能很長。我根據示例試圖使用val * 1+val * 10+val * 100…的方式進行計算,然而提交執行時的數據長達13個節點,直接導致了int數據溢出。
最終解題代碼:

	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int count=0,carry=0,sum;
        ListNode ret=new ListNode(0),r=ret;
        while(l1!=null||l2!=null){
           if(l1!=null){
               count+=l1.val;
               l1=l1.next;
           }
           if(l2!=null){
               count+=l2.val;
               l2=l2.next;
           }
           sum=count+carry;
           r.next=new ListNode(sum%10);
           r=r.next;
           carry=sum/10;
           count=0;
        }
        if(carry!=0){
             r.next=new ListNode(1);
        }
        return ret.next;
    }

3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。

示例 1:
輸入: “abcabcbb”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “abc”,所以其長度爲 3。
示例 2:
輸入: “bbbbb”
輸出: 1
解釋: 因爲無重複字符的最長子串是 “b”,所以其長度爲 1。
示例 3:
輸入: “pwwkew”
輸出: 3
解釋: 因爲無重複字符的最長子串是 “wke”,所以其長度爲 3。
請注意,你的答案必須是 子串 的長度,“pwke” 是一個子序列,不是子串。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters

這裏注意題目給的字符串將 " 也算作了內容,例如"a"字符串長度爲3,所以字符串的s.charAt(0) == s.charAt(s.length()-1)必然成立,不需要擔心字符串從頭到尾沒有重複字符導致沒有賦值的情況。
輸入字符串可能出現爲""" ",但因爲"爲字符串內容,對代碼沒有影響。
消耗時間,節省空間的方法:

	public int lengthOfLongestSubstring(String s) {
        System.out.println(s);
        int maxcount=0,maxcountin,len=s.length();
        for(int x=0;x<len;x++){
            maxcountin=len-x;
            for(int i=x;i<len;i++){
                for(int j=(i+1);j<x+maxcountin;j++){
                    if(s.charAt(i)==s.charAt(j)){
                        if(maxcountin>(j-x)){            
                            maxcountin=j-x;
                        }
                        break;
                    }
                }
            }
            if(maxcount<maxcountin){
                maxcount=maxcountin;
            }
        }
        return maxcount;
    }

4. 尋找兩個有序數組的中位數

給定兩個大小爲 m 和 n 的有序數組 nums1 和 nums2。
請你找出這兩個有序數組的中位數,並且要求算法的時間複雜度爲 O(log(m + n))。
你可以假設 nums1 和 nums2 不會同時爲空。

示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
示例 2:
nums1 = [1, 2]
nums2= [3, 4]
則中位數是 (2 + 3)/2 = 2.5

需要注意當其中一個數組歸併完畢後可能出現的數組越界問題,以及總數爲偶數時中位數取平均數的除法自動抹去小數點後數字問題(將/2改爲/2.0)
解題代碼:

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int i=0,j=0,k=0,length=nums1.length+nums2.length;
        int nums[]=new int[length];
        for(;i<length;i++){
            if(nums1.length==j||nums2.length==k){
               break;
           }
            if(nums1[j]<nums2[k]){
                nums[i]=nums1[j];
                j++;
            }else{
                nums[i]=nums2[k];
                k++;
            }
        }
        while(j<nums1.length){
            nums[i++]=nums1[j];
            j++;
        }
        while(k<nums2.length){
            nums[i++]=nums2[k];
            k++;
        }
        if(length%2!=0){
            return nums[length/2];
        }else{
            return (nums[length/2-1]+nums[length/2])/2.0;
        }
    }

5. 最長迴文子串
給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出:“bb”

我使用了將每一個字符視爲可能的迴文中點,向兩邊驗證的方法,爲了解決迴文長度爲偶數,即“abba”類型的迴文,將字符串的每個字符之間插入了“#”字符,思路可行,但代碼的執行用時和內存消耗都不算理想。
解題代碼:

public String longestPalindrome(String s) {
        int site=0,length=0;
        StringBuffer b=new StringBuffer("#");
        for(int i=0;i<s.length();i++){
            b.append(s.charAt(i)+"#");
        }
        for(int i=1;i<b.length();i++){//size
           for(int j=1;j<b.length()-i;j++){//length
				if(i-j<0){
					break;
				}
				if(b.charAt(i-j)==b.charAt(i+j)){
					if(j>length) {
						site = i;
						length = j ;
					}
				}else {
					break;
				}
			}
        }
        StringBuffer b1=new StringBuffer();
        for(int i=0-length;i<=length;i++){
			if(b.charAt(i+site)!='#'){
				b1.append(b.charAt(i+site));
			}
		}
        return b1.toString();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章