zoukankan      html  css  js  c++  java
  • leetcode 1

    1. Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific target.

    You may assume that each input would have exactly one solution, and you may not use the same element twice.

    Example:

    Given nums = [2, 7, 11, 15], target = 9,
    
    Because nums[0] + nums[1] = 2 + 7 = 9,
    return [0, 1].

    求数组中两个数相加的和等于target,且答案只有一个。

    1、用map实现,注意一次就可以通过,不需要把先把所有数据加到map中,边加边寻找。

    2、其次,如果遍历两次的话,需要注意同一个数不能用两次,但是如果这个数出现了两次,是可以使用的。

    3、可以排序。

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

    2. Add Two Numbers

    You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

    You may assume the two numbers do not contain any leading zero, except the number 0 itself.

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
    Output: 7 -> 0 -> 8

    两个非空链表相加

    注意进位

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            int flag = 0;
            ListNode head = new ListNode(0);
            ListNode result = head;
            while (l1 != null || l2 != null || flag != 0){
                int num = flag;
                if (l1 != null){
                    num += l1.val;
                    l1 = l1.next;
                }
                if (l2 != null){
                    num += l2.val;
                    l2 = l2.next;
                }
                head.next = new ListNode(num % 10);
                flag = num / 10;
                head = head.next;
            }
            return result.next;
        }
    }

    3. Longest Substring Without Repeating Characters

    Given a string, find the length of the longest substring without repeating characters.

    Examples:

    Given "abcabcbb", the answer is "abc", which the length is 3.

    Given "bbbbb", the answer is "b", with the length of 1.

    Given "pwwkew", the answer is "wke", with the length of 3. Note that the answer must be a substring, "pwke" is a subsequence and not a substring.

    求一个字符串中不出现重复数字的最大长度。

    很多种做法:

    1、暴力枚举

    2、使用窗口发(set、map都可以)

    3、使用ASCII码(数组)

    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            if (s.length() == 0){
                return 0;
            }
            int[] pos = new int[256];
            char[] word = s.toCharArray();
            int maxLen = 1;
            int start = 0;
            for (int i = 0; i < 256; i++){
                pos[i] = -1;
            }
            for (int i = 0; i < word.length; i++){
                int num = (int) (word[i]);
                if (pos[num] != -1){
                    maxLen = Math.max(maxLen, i - start);
    
                    int begin = pos[num] + 1;
                    for (int j = start; j < pos[num]; j++){
                        pos[(int) (word[j])] = -1;
                    }
                    pos[num] = i;
                    start = begin;
                } else {
                    pos[num] = i;
                }
            }
            maxLen = Math.max(maxLen, word.length - start);
            return maxLen;
        }
    }
    public class Solution {
        public int lengthOfLongestSubstring(String s) {
            int n = s.length(), ans = 0;
            int[] index = new int[128]; // current index of character
            // try to extend the range [i, j]
            for (int j = 0, i = 0; j < n; j++) {
                i = Math.max(index[s.charAt(j)], i);
                ans = Math.max(ans, j - i + 1);
                index[s.charAt(j)] = j + 1;
            }
            return ans;
        }
    }

    4. Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively.

    Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    Example 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    The median is 2.0
    

    Example 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    The median is (2 + 3)/2 = 2.5
    

    求连个数组的中位数,如果是偶数个,那么取平均值。并且要求时间复杂度是O(log (m+n))

    1、暴力做法的负载度是O(m + n)不符合题意。

    2、使用二分法的想法:如果A的中点大于B的中点,那么所求中点应该在A的左边和B的右边,复杂度是O(log (m+n))

    public class Solution {
        public double findMedianSortedArrays(int[] A, int[] B) {
            int m = A.length, n = B.length;
            int l = (m + n + 1) / 2;
            int r = (m + n + 2) / 2;
            return (getkth(A, 0, B, 0, l) + getkth(A, 0, B, 0, r)) / 2.0;
        }
    
    public double getkth(int[] A, int aStart, int[] B, int bStart, int k) {
        if (aStart > A.length - 1) return B[bStart + k - 1];            
        if (bStart > B.length - 1) return A[aStart + k - 1];                
        if (k == 1) return Math.min(A[aStart], B[bStart]);
        
        int aMid = Integer.MAX_VALUE, bMid = Integer.MAX_VALUE;
        if (aStart + k/2 - 1 < A.length) aMid = A[aStart + k/2 - 1]; 
        if (bStart + k/2 - 1 < B.length) bMid = B[bStart + k/2 - 1];        
        
        if (aMid < bMid) 
            return getkth(A, aStart + k/2, B, bStart,       k - k/2);// Check: aRight + bLeft 
        else 
            return getkth(A, aStart,       B, bStart + k/2, k - k/2);// Check: bRight + aLeft
    }
    }

    5. Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

    Example:

    Input: "babad"
    
    Output: "bab"
    
    Note: "aba" is also a valid answer.
    

    Example:

    Input: "cbbd"
    
    Output: "bb"

    寻找最长回文子串

    1、以每个字母以及两个字母中间为中心(后者在字母中间添加一个#之类的标记),构造回文串,然后看长度。

    2、Manacher’s Algorithm

     

  • 相关阅读:
    Ubuntu-18.04 设置开机启动脚本
    香橙派PC Plus开发镜像制作
    Flurl使用Polly添加重试机制
    在Windows上远程调试Ubuntu-Arm上的.Netcore
    NAT
    关于visual studio 2019的参数信息快捷键无效
    spring cloud ip地址注册问题
    spring cloud sleuth集成问题
    spring boot admin 安装问题
    pm2+nuxt 自动重启问题
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/6651940.html
Copyright © 2011-2022 走看看