leetCode100 第3,4题
3、无重复最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
class Solution {
// 滑动区间算法,看似两个循环,实则第二个一个循环最多只会移动n次,所以时间复杂度只有O(N)
// 直接使用模拟队列实现,把list集合当成一个双端队列,可以左边出,右边进,始终维护一个不重复最长串,最后求出最大值
public int lengthOfLongestSubstring(String s) {
List<Character> list = new ArrayList();
int max = 0;
for (int i = 0; i < s.length(); i++) {
//如果集合中已包含了该字符,则从集合中删除该字符及之前的全部字符
while (list.contains(s.charAt(i))) {
list.remove(0);
}
list.add(s.charAt(i));
//每次添加字符串,就重新判断最大长度
max = Math.max(max, list.size());
}
return max;
}
}
4. 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
// 创建一个可变的列表用于存放合并后的数组
ArrayList<Integer> ans = new ArrayList<>();
// 将 nums1 和 nums2 中的元素逐一添加到 ans 列表
for (int num : nums1) {
ans.add(num);
}
for (int num : nums2) {
ans.add(num);
}
// 对合并后的列表进行排序
Collections.sort(ans);
int totalLength = len1 + len2;
// 判断总长度是否为偶数
if (totalLength % 2 == 0) {
// 如果为偶数,返回中间两个数的平均值
return (ans.get(totalLength / 2) + ans.get(totalLength / 2 - 1)) / 2.0;
} else {
// 如果为奇数,返回中间的数
return ans.get(totalLength / 2);
}
}
}
|
作者:万能包哥 出处:http://www.cnblogs.com/mybloger/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |
浙公网安备 33010602011771号