一.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; } };