LeetCode 热题 HOT 100 Day3
LeetCode 热题 HOT 100 Day3
3.无重复字符的最长字符串(难度:中等)
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
解法1:滑动窗口(用vector代替哈希表)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> m(128,0); //总共128个ascii码
int i = 0;
int length = 0;//记录最长长度
for(int j = 0; j < s.size(); j++){
i = max(i,m[s[j]]);//记录最左边的索引,若出现相同值,则i的值为相同字母的下一个坐标
m[s[j]] = j+1;//记录这个字母下一个坐标
length = max(length,j-i+1);
}
return length;
}
};
补充说明:
解法2:滑动窗口(哈希表法)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char,int> occ;
int left = 0;
int length = 0;
int i = 0;
while(i < s.size()){
left = max(left,occ[s[i]]);
occ[s[i]] = i+1;
length = max(length,i-left+1);
i++;
}
return length;
}
};
4.寻找两个正序数组的中位数(难度:困难)
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log (m+n))
https://leetcode.cn/problems/median-of-two-sorted-arrays
解法1:快排(时间复杂度不达标)
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> nums3;
nums3.reserve(nums1.size() + nums2.size()); // 预留空间
nums3.insert(nums3.end(), nums1.begin(), nums1.end()); // 将 nums1 插入 nums3
nums3.insert(nums3.end(), nums2.begin(), nums2.end()); // 将 nums2 插入 nums3
QuickSort(nums3,0,nums3.size()-1);
int length = nums3.size();
if(length%2 == 0){
return (nums3[(length-1)/2]+nums3[(length-1)/2+1])/2.0;
}else{
return nums3[length/2];
}
}
void QuickSort(vector<int>& nums,int left,int right){
if (left >= right) return;
int pivot = nums[left + (right - left) / 2];
int i = left, j = right;
while (i <= j) {
while (nums[i] < pivot) i++;
while (nums[j] > pivot) j--;
if (i <= j) {
swap(nums[i], nums[j]);
i++;
j--;
}
}
QuickSort(nums, left, j);
QuickSort(nums, i, right);
}
};
解法2:二分法(正确解法)
理解算法内容,不知如何写代码