【推奨アルゴリズム問題演習】day4


1. 3. 繰り返し文字を含まない最長の部分文字列

1. トピックの紹介

3. 文字の繰り返しを含まない最長の部分文字列
文字列 s が与えられた場合、文字の繰り返しを含まない最長の部分文字列の長さを見つけてください。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 問題解決のアイデア

3.コード

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. 走行結果

ここに画像の説明を挿入します

2. 1004. 連続する 1 の最大数 III

1. トピックの紹介

1004. 連続 1 の最大数 III
バイナリ配列 nums と整数 k が与えられた場合、最大で k 個の 0 を反転できる場合、配列内の連続 1 の最大数を返します。
ここに画像の説明を挿入します

2. 問題解決のアイデア

3.コード

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. 走行結果

ここに画像の説明を挿入します

3. 1658. x を 0 に減らすための最小演算数

1. トピックの紹介

1658. x を 0 に減らすためのオペランドの最小数。
整数 nums の配列と整数 x が与えられます。各操作では、配列 nums の左端または右端の要素を削除し、その要素の値を x から減算する必要があります。後続の操作では配列を変更する必要があることに注意してください。
x を正確に 0 に減らすことができる場合は、最小のオペランドが返され、それ以外の場合は -1 が返されます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します

2. 問題解決のアイデア

3.コード

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 日目です。3
フィートの氷は 1 日もたないので、頑張ってください。
質問元: LeetCode、著作権は LeetCode に属します。
この記事があなたにインスピレーションを与えたなら、著者をもっとサポートしていただければ幸いです。皆さん、ありがとう!

おすすめ

転載: blog.csdn.net/xjjxjy_2021/article/details/131654050