11. 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
题意
在一个数组中选择两个值,这两个值与索引值之间的距离构成的一个容器所能容纳最多的水。
思路
利用双指针算法,一个指针i从前往后,一个指针j从后往前,(i < j)每次移动值较小的指针,每次更新对应面积的大小。
代码
class Solution {
public:
int maxArea(vector<int>& height) {
int res = 0;
int i = 0, j = height.size() - 1;
while(i < j){
res = max(res, (j - i) * min(height[i],height[j]));
if(height[i] < height[j]) i++;
else j--;
}
return res;
}
};
15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
题意
在一个数组中找三个下标互不相等的数并且这三个数的和为0
思路
先把数组进行排序,固定i,j从i+1开始往后,k从最后往前,如果出现重复的数跳过,当三个数的值大于等于0,k–,最后判断是否存在答案。
代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(),nums.end());
for(int i = 0; i < nums.size() - 1;i++){
if(i && nums[i - 1] == nums[i]) continue;
for(int j = i + 1, k = nums.size() - 1; j < k; j++){
if(j > i + 1 && nums[j - 1] == nums[j]) continue;
while(k - 1 > j && nums[i] + nums[j] + nums[k - 1] >= 0) k--;
if(nums[i] + nums[j] + nums[k] == 0){
res.push_back({nums[i],nums[j],nums[k]});
}
}
}
return res;
}
};
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
题意
求字符串中最长的不重复的字串的长度
思路
利用双指针,i在前,j在后,用一个哈希表存区间字符的个数,当区间内不存在相同字符时,i往后,如果存在相同的字符,j往后直至没有相同的字符。
代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> heap;
int res = 0;
for(int i = 0, j = 0; i < s.size(); i++){
heap[s[i]]++;
while(heap[s[i]] > 1){
heap[s[j]]--;
j++;
}
res = max(res, i - j + 1);
}
return res;
}
};