秋招力扣hot100学习记录(二)

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;
    }
};
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值