两道算法题

148 阅读2分钟

01

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:

输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:

输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

import java.util.HashSet;
import java.util.Set;

/**
 * 2019/5/5
 */
public class code_003 {

    /**
     * 求出字符串中最长的不重复字符串
     * aba = 2
     * aaa = 1
     */
    public class Solution_01 {
        public int legthOfLongestSubstring(String s) {
            int n = s.length();
            int ans = 0;
            for (int i = 0; i < n; i++) {
                for (int j = i + 1; j <= n; j++) {
                    if (allUniqueue(s, i, j)) {
                        ans = Math.max(ans, j - 1);
                    }
                }
            }
            return ans;
        }

        public boolean allUniqueue(String s, int start, int end) {
            Set<Character> set = new HashSet<>();
            for (int i = start; i < end; i++) {
                Character ch = s.charAt(i);
                if (set.contains(ch)) {
                    return false;
                }
            }
            return true;
        }
    }

}

02

给定两个大小为 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

/**
 * 2019.5.5
 */
public class code_004 {
    /**
     * 求两个有序数组合并起来的中位数
     * @param nums1
     * @param nums2
     * @return
     */
    public double findMidianSortedArray(int[] nums1, int[] nums2) {
        /**
         * The index of arrays
         */
        int p1 = 0;
        int p2 = 0;
        int pos = 0;

        /**
         * The length of arrays
         */
        int ls1 = nums1.length;
        int ls2 = nums2.length;

        int[] all_nums = new int[ls1 + ls2];
        /**
         * init median value
         */
        double median = 0.0;

        while (p1 < ls1 && p2 < ls2) {
            if (nums1[p1] < nums2[p2]) {
                all_nums[pos++] = nums1[p1++];
            } else {
                all_nums[pos++] = nums2[p2++];
            }
        }

        while (p1 < ls1) {
            all_nums[pos++] = nums1[p1++];
        }
        while (p2 < ls2) {
            all_nums[pos++] = nums2[p2++];
        }
        if ((ls1 + ls2) % 2 == 1) {
            median = all_nums[(ls1 + ls2) / 2];
        } else {
            median = (all_nums[(ls1 + ls2) / 2] + all_nums[(ls1 + ls2) / 2 - 1]) / 2.0;
        }
        return median;

    }
}

最近开始工作了,新手一个,工作内容不是很主流,但是不加班,所以希望能每天坚持刷两道题,看会书,写写代码。