代码随想录——双指针与滑动窗口(四)

简介: 代码随想录——双指针与滑动窗口(四)

一.1423. 可获得的最大点数

题目详情

解题思路

这里我们每次只能取最左或最右边的卡牌,第一反应其实是使用双指针,通过局部贪心来解决,但是如果两边相等的话用局部贪心无法来判断到底取哪一边,那我们不妨换一个思路:

我们首先任选一边维持一个长度为k的子数组,计算出子数组的和,记录下来为当前最大值,然后定义左右指针,删去左指针指向的值,加上右指针指向的值,不断更新当前最大值,当左指针的位置到-1,当前最大值就是目标值。

解题代码:

  • Go
func max(a,b int)int{
    if a>b{
        return a
    }else{
        return b
    }
}
func maxScore(cardPoints []int, k int) int {
    if k==0{
        return 0
    }
    n:=len(cardPoints)
    l,r:=0,n-1
    res:=0
    for l<k{
        res+=cardPoints[l]
        l++
    }
    l=k-1
    maxvalue:=res
    for l>=0{
        res-=cardPoints[l]
        res+=cardPoints[r]
        l--
        r--
        maxvalue=max(maxvalue,res)
    }
    return maxvalue
}
  • Cpp
class Solution {
public:
    int max(int a, int b) {
        return a > b ? a : b;
    }
    int maxScore(std::vector<int>& cardPoints, int k) {
        if (k == 0) {
            return 0;
        }
        int n = cardPoints.size();
        int l = 0, r = n - 1;
        int res = 0;
        for (l = 0; l < k; l++) {
            res += cardPoints[l];
        }
        l = k - 1;
        int maxvalue = res;
        while (l >= 0) {
            res -= cardPoints[l];
            res += cardPoints[r];
            l--;
            r--;
            maxvalue = max(maxvalue, res);
        }
        return maxvalue;
    }
};

二.1456. 定长子串中元音的最大数目

题目详情

解题思路

这道题属于一个比较典型的滑动窗口题目了,我们维护一个定长的滑动窗口,记录里面的元音字母数即可。

代码

  • Go
func in (s rune) bool{
    if s=='a'||s=='o'||s=='e'||s=='i'||s=='u'{
        return true
    }else{
        return false
    }
}
func max(a,b int)int{
    if a>b{
        return a
    }else{
        return b
    }
}
func maxVowels(s string, k int) int {
   n:=len(s)
   l:=0
   maxvalue:=0
   sum:=0
   for r:=0;r<n;r++{
    if in(rune(s[r])){
        sum++
    }
    if r-l+1>k{
        if in(rune(s[l])){
            sum--
        }
        l++
    }
    maxvalue=max(maxvalue,sum)
   }
   return maxvalue
    
}
  • Cpp
class VowelCounter {
public:
    bool isVowel(char s) {
        if (s == 'a' || s == 'o' || s == 'e' || s == 'i' || s == 'u') {
            return true;
        }
        return false;
    }
    int max(int a, int b) {
        return a > b ? a : b;
    }
    int maxVowels(std::string s, int k) {
        int n = s.length();
        int l = 0;
        int maxvalue = 0;
        int sum = 0;
        for (int r = 0; r < n; r++) {
            if (isVowel(s[r])) {
                sum++;
            }
            if (r - l + 1 > k) {
                if (isVowel(s[l])) {
                    sum--;
                }
                l++;
            }
            maxvalue = max(maxvalue, sum);
        }
        return maxvalue;
    }
};

相关文章
|
8天前
|
Go C++
代码随想录——双指针/滑动窗口(三)
代码随想录——双指针/滑动窗口(三)
|
8天前
|
Go C++
代码随想录——双指针/滑动窗口(二)
代码随想录——双指针/滑动窗口(二)
|
8天前
代码随想录——双指针(一)
代码随想录——双指针(一)
|
22天前
|
算法
双指针+滑动窗口
双指针+滑动窗口
|
27天前
|
C语言
C语言指针带代码
C语言指针带代码
24 3
|
1月前
【错题集-编程题】dd爱框框(同向双指针 / 滑动窗口)
【错题集-编程题】dd爱框框(同向双指针 / 滑动窗口)
|
1月前
|
索引
LeetCode438题(无敌双指针——滑动窗口)
LeetCode438题(无敌双指针——滑动窗口)
|
1月前
|
C++
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
|
1月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
1月前
|
存储
【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针
我们可以使用双指针解决本题,定义两个指针 i 和 j 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和。每一轮迭代中,每当 sum >= target 则记录子数组最小长度,移动慢指针。在每一轮迭代最后,移动快指针