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;
}
}