前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【优选算法题练习】day4

【优选算法题练习】day4

作者头像
摘星
发布2023-10-15 15:53:27
1070
发布2023-10-15 15:53:27
举报
文章被收录于专栏:C/C++学习C/C++学习

一、3. 无重复字符的最长子串

1.题目简介

3. 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.解题思路

3.代码

代码语言:javascript
复制
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        if(n == 0 || n == 1) return n;
        int begin = 0, end = 0;
        int ret = 1;
        int hash[128] = {0};
        while(end < n)
        {
            if(hash[s[end]] == 0)
            {
                hash[s[end++]]++;
                ret = max(ret, end - begin);
            }
            else
            {
                hash[s[begin++]]--;
            }
        }
        return ret;
    }
};

4.运行结果

在这里插入图片描述
在这里插入图片描述

二、1004. 最大连续1的个数 III

1.题目简介

1004. 最大连续1的个数 III 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。

在这里插入图片描述
在这里插入图片描述

2.解题思路

3.代码

代码语言:javascript
复制
class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        //可以将题目转化为求最多有k个0的最长连续区间的长度
        int ret = 0;
        int begin = 0, end = 0;
        int num = 0;//区间内0的个数
        while(end < nums.size())
        {
            if(nums[end++] == 0) num++;//入窗口
            while(num > k)//出窗口
            {
                if(nums[begin++] == 0) num--;
            }
            ret = max(ret, end - begin);
        }
        return ret;
    }
};

4.运行结果

在这里插入图片描述
在这里插入图片描述

三、1658. 将 x 减到 0 的最小操作数

1.题目简介

1658. 将 x 减到 0 的最小操作数 给你一个整数数组 nums 和一个整数 x 。每一次操作时,你应当移除数组 nums 最左边或最右边的元素,然后从 x 中减去该元素的值。请注意,需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 ,返回 最小操作数 ;否则,返回 -1 。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.解题思路

3.代码

代码语言:javascript
复制
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
    //可以将题目转化为求nums数组中一段最长的和为sum(nums) - x的连续子数组的长度len(再用nums.size() - len就能得到结果)
        int sum = 0;
        for(auto& e : nums)
        {
            sum += e;
        }
        int target = sum - x;
        if(target < 0) return -1;
        int len = -1;
        sum = 0;
        int left = 0, right = 0;
        while(right < nums.size())
        {
            //入窗口
            sum += nums[right++];
            //出窗口
            while(sum > target)
            sum -= nums[left++];
            //更新结果
            if(sum == target)
            {
                len = max(len, right - left);
            }
        }
        if(len == -1)
        {
            return -1;
        }
        return nums.size() - len;
    }
};

4.运行结果

在这里插入图片描述
在这里插入图片描述

总结

今天是算法练习的第4天, 冰冻三尺非一日之寒,继续加油。 题目来源:力扣(LeetCode),著作权归领扣网络所有。 如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、3. 无重复字符的最长子串
    • 1.题目简介
      • 2.解题思路
        • 3.代码
          • 4.运行结果
          • 二、1004. 最大连续1的个数 III
            • 1.题目简介
              • 2.解题思路
                • 3.代码
                  • 4.运行结果
                  • 三、1658. 将 x 减到 0 的最小操作数
                    • 1.题目简介
                      • 2.解题思路
                        • 3.代码
                          • 4.运行结果
                          • 总结
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档