1031. Maximum Sum of Two Non-Overlapping Subarrays
java
java
class Solution {
public int maxSumTwoNoOverlap(int[] nums, int fir, int sec) {
return Math.max(maxSum(nums, fir, sec), maxSum(nums, sec, fir));
}
private int maxSum(int[] nums, int l, int m) {
// initialize
int sumL = 0, sumM = 0;
for (int i = 0; i < l + m; i++) {
if (i < l) sumL += nums[i];
else sumM += nums[i];
}
// mark the max sum of the L-length subarray, L and M don't need to be adjacent.
int maxL = sumL;
// there is no variable 'maxM', otherwise it will cause overlap
int res = maxL + sumM;
for (int i = l + m; i < nums.length; i++) {
sumL += nums[i - m] - nums[i - m - l]; // compute the sum of every L-length subarray
sumM += nums[i] - nums[i - m];
maxL = Math.max(maxL, sumL);
res = Math.max(res, maxL + sumM);
}
return res;
}
}1208. Get Equal Substrings Within Budget
java
java
class Solution {
public int equalSubstring(String s, String t, int maxCost) {
int i = 0, cost = 0, res = 0;
for (int j = 0; j < s.length(); j++) {
cost += Math.abs(s.charAt(j) - t.charAt(j));
while (cost > maxCost) {
cost -= Math.abs(s.charAt(i) - t.charAt(i));
i++;
}
res = Math.max(res, j - i + 1);
}
return res;
}
}2090. K Radius Subarray Averages
java
java
class Solution {
public int[] getAverages(int[] nums, int k) {
int len = 2 * k + 1, n = nums.length;
int[] ans = new int[n];
Arrays.fill(ans, -1);
long sum = 0;
for (int i = 0; i < n; ++i) {
sum += nums[i];
if (i >= len) sum -= nums[i - len];
if (i >= len - 1) ans[i - k] = (int) (sum / len);
}
return ans;
}
}3. Longest Substring Without Repeating Characters
go
go
func lengthOfLongestSubstring(s string) int {
counter := [256]int{}
i, res := 0, 0
for j := range s {
counter[s[j]]++
for ; counter[s[j]] > 1; i++ {
counter[s[i]]--
}
res = max(res, j-i+1)
}
return res
}Use hashset
java
java
class Solution {
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set = new HashSet<>();
int i = 0, res = 0, n = s.length();
char[] chars = s.toCharArray();
for (int j = 0; j < n; j++) {
while (set.contains(chars[j])) {
set.remove(chars[i++]);
}
set.add(chars[j]);
res = Math.max(res, set.size());
}
return res;
}
}rust
rust
use std::cmp::max;
use std::collections::HashSet;
impl Solution {
pub fn length_of_longest_substring(s: String) -> i32 {
let mut set: HashSet<char> = HashSet::new();
let mut res = 0;
let mut i = 0;
let s: Vec<char> = s.chars().collect();
for j in 0..s.len() {
while set.contains(&s[j]) {
set.remove(&s[i]);
i += 1;
}
set.insert(s[j]);
res = max(res, set.len());
}
res as i32
}
}30. Substring with Concatenation of All Words
rust
rust
use std::collections::HashMap;
impl Solution {
pub fn find_substring(s: String, words: Vec<String>) -> Vec<i32> {
let n = s.len();
let m = words.len();
let w = words[0].len();
let need = words.iter().fold(HashMap::new(), |mut acc, word| {
*acc.entry(&word[..]).or_insert(0) += 1;
acc
});
let mut res = vec![];
// offset
for i in 0..w {
let mut need = need.clone();
let mut valid = 0;
// build the window word by word
for j in (i..n - w + 1).step_by(w) {
// j is the left bound of the word, right bound of the window
let curr = &s[j..j + w];
if let Some(val) = need.get(curr) {
if *val > 0 { valid += 1; }
}
*need.entry(curr).or_default() -= 1;
// shrink the window
if j >= m * w {
let idx = j - m * w;
let prev = &s[idx..idx + w];
let num = need.entry(prev).or_default();
*num += 1;
if *num > 0 { valid -= 1; }
}
if valid == m {
res.push((j + w - m * w) as _)
}
}
}
res
}
}java
java
class Solution {
List<Integer> findSubstring(String s, String[] words) {
int n = s.length(), m = words.length, w = words[0].length();
Map<String, Integer> target = new HashMap<>();
for (String str : words)
target.put(str, target.getOrDefault(str, 0) + 1);
List<Integer> ans = new ArrayList<>();
// offset
for (int i = 0; i < w; i++) {
Map<String, Integer> cnt = new HashMap<>(target);
int valid = 0;
for (int j = i; j < n - w + 1; j += w) {
String curr = s.substring(j, j + w);
if (cnt.containsKey(curr) && cnt.get(curr) > 0) valid++;
cnt.put(curr, cnt.getOrDefault(curr, 0) - 1);
// shrink the window
if (j >= m * w) {
int idx = j - m * w;
String prev = s.substring(idx, idx + w);
cnt.put(prev, cnt.get(prev) + 1);
if (cnt.get(prev) > 0) valid--;
}
if (valid == m) ans.add(j + w - m * w);
}
}
return ans;
}
}76. Minimum Window Substring
Go
go
func minWindow(s string, t string) string {
need := make([]int, 128)
for _, ch := range t {
need[ch]++
}
i, res, valid := 0, 0, 0
d := math.MaxInt32
for j := range s {
if need[s[j]] > 0 {
valid++
}
need[s[j]]--
for ; valid == len(t); i++ {
if d > j-i+1 {
d = j - i + 1
res = i
}
need[s[i]]++
if need[s[i]] > 0 {
valid--
}
}
}
if d == math.MaxInt32 {
return ""
}
return s[res : res+d]
}java
java
class Solution {
public String minWindow(String source, String target) {
int valid = 0, d = Integer.MAX_VALUE, res = 0;
int[] need = new int[128];
for (char c : target.toCharArray())
need[c]++;
char[] cs = source.toCharArray();
for (int i = 0, j = 0; j < source.length(); j++) {
if (need[cs[j]] > 0) valid++;
need[cs[j]]--;
for (; valid == target.length(); i++) {
if (j - i + 1 < d) {
d = j - i + 1;
res = i;
}
need[cs[i]]++;
if (need[cs[i]] > 0) valid--;
}
}
return d == Integer.MAX_VALUE ? "" : source.substring(res, res + d);
}
}rust
rust
impl Solution {
pub fn min_window(s: String, t: String) -> String {
let mut d = usize::MAX;
let mut i = 0;
let mut res = 0;
let mut need = t.as_bytes().iter().fold(vec![0; 128], |mut acc, x| {
acc[*x as usize] += 1;
acc
});
let mut valid = 0;
let arr = s.as_bytes().iter().map(|&x| x as usize).collect::<Vec<usize>>();
for (j, &right) in arr.iter().enumerate() {
if need[right] > 0 { valid += 1; }
need[right] -= 1;
while valid == t.len() {
if d > j - i + 1 {
d = j - i + 1;
res = i;
}
let left = arr[i];
need[left] += 1;
if need[left] > 0 { valid -= 1; }
i += 1;
}
}
if d == usize::MAX { "".into() } else { s[res..res + d].into() }
}
}209. Minimum Size Subarray Sum
python
python
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left, window_sum = 0, 0
res = sys.maxsize
for right in range(len(nums)):
window_sum += nums[right]
while window_sum >= target:
res = min(res, right - left + 1)
window_sum -= nums[left]
left += 1
return res if res != sys.maxsize else 0go
go
func minSubArrayLen(target int, nums []int) int {
res, sum, i := math.MaxInt32, 0, 0
for j := range nums {
sum += nums[j]
for ; sum >= target; i++ {
sum -= nums[i]
res = min(j-i+1, res)
}
}
if res == math.MaxInt32 {
return 0
}
return res
}220. Contains Duplicate III
go
go
func containsNearbyAlmostDuplicate(nums []int, indexDiff int, valueDiff int) bool {
if indexDiff <= 0 || valueDiff < 0 || len(nums) < 2 {
return false
}
buckets := make(map[int]int)
for i := range nums {
key := nums[i] / (valueDiff + 1)
if nums[i] < 0 {
key--
}
if _, ok := buckets[key]; ok {
return true
}
if v, ok := buckets[key-1]; ok && nums[i]-v <= valueDiff {
return true
}
if v, ok := buckets[key+1]; ok && v-nums[i] <= valueDiff {
return true
}
if len(buckets) >= indexDiff {
delete(buckets, nums[i-indexDiff]/(valueDiff+1))
}
buckets[key] = nums[i]
}
return false
}python
python
class Solution:
def containsNearbyAlmostDuplicate(self, nums: List[int], k: int, t: int) -> bool:
if k <= 0 or t < 0 or len(nums) < 2:
return False
buckets = {}
for i in range(len(nums)):
key = nums[i] // (t + 1)
if key in buckets:
return True
if (key - 1) in buckets and nums[i] - buckets[key - 1] <= t:
return True
if (key + 1) in buckets and buckets[key + 1] - nums[i] <= t:
return True
if len(buckets) >= k:
del buckets[nums[i - k] // (t + 1)]
buckets[key] = nums[i]
return False239. Sliding Window Maximum
rust
rust
use std::collections::VecDeque;
impl Solution {
pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32> {
let mut res = vec![];
let k = k as usize;
let mut deque: VecDeque<usize> = VecDeque::new();
for (i, &v) in nums.iter().enumerate() {
if i > k - 1 && deque[0] == i - k {
deque.pop_front();
}
while let Some(&top) = deque.back() {
if v > nums[top] {
deque.pop_back();
} else {
break;
}
}
deque.push_back(i);
if i >= k - 1 {
res.push(nums[deque[0]])
}
}
res
}
}java
java
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] res = new int[n - k + 1];
ArrayDeque<Integer> deque = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
if (!deque.isEmpty() && deque.peek() == i - k)
deque.poll();
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
deque.pollLast();
}
deque.offer(i);
if (i >= k - 1)
res[i - k + 1] = nums[deque.peek()];
}
return res;
}
}Go deque
go
func maxSlidingWindow(nums []int, k int) []int {
n := len(nums)
res := make([]int, n-k+1)
dq := make([]int, 0, k+1)
for i, v := range nums {
if i > k-1 && dq[0] == i-k {
dq = dq[1:]
}
for len(dq) > 0 && v > nums[dq[len(dq)-1]] {
dq = dq[:len(dq)-1]
}
dq = append(dq, i)
if i >= k-1 {
res[i-k+1] = nums[dq[0]]
}
}
return res
}Python deque
python
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
res, dq = [], deque()
for i, v in enumerate(nums):
if i > k-1 and dq[0] < i - k + 1:
dq.popleft()
while dq and v > nums[dq[-1]]:
dq.pop()
dq += i,
if i > k-2:
res += nums[dq[0]],
return resdivide & conquer
go
func maxSlidingWindow(nums []int, k int) []int {
res := make([]int, len(nums)-k+1)
left, right := make([]int, len(nums)), make([]int, len(nums))
for i := range nums {
if i%k == 0 {
left[i] = nums[i]
} else {
left[i] = max(nums[i], left[i-1])
}
j := len(nums) - 1 - i
if j%k == k-1 || j == len(nums)-1 {
right[j] = nums[j]
} else {
right[j] = max(nums[j], right[j+1])
}
}
for m := 0; m < len(nums)-k+1; m++ {
res[m] = max(right[m], left[m+k-1])
}
return res
}divide & conquer
python
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
n = len(nums)
res, left, right = [0] * (n - k + 1), [0] * n, [0] * n
for i in range(n):
if i % k == 0:
left[i] = nums[i]
else:
left[i] = max(nums[i], left[i - 1])
j = n - 1 - i
if j % k == k - 1 or j == n - 1:
right[j] = nums[j]
else:
right[j] = max(nums[j], right[j + 1])
for i in range(n - k + 1):
res[i] = max(right[i], left[i + k - 1])
return res395. Longest Substring with At Least K Repeating Characters
java
java
class Solution {
public int longestSubstring(String s, int k) {
int res = 0;
for (int p = 1; p <= 26; p++) {
int[] cnt = new int[26];
for (int i = 0, j = 0, distinct = 0, valid = 0; j < s.length(); j++) {
int J = s.charAt(j) - 'a';
cnt[J]++;
if (cnt[J] == 1) distinct++;
if (cnt[J] == k) valid++;
while (distinct > p) {
int I = s.charAt(i++) - 'a';
cnt[I]--;
if (cnt[I] == 0) distinct--;
if (cnt[I] == k - 1) valid--;
}
if (distinct == valid) res = Math.max(res, j - i + 1);
}
}
return res;
}
}rust
rust
use std::cmp::max;
impl Solution {
pub fn longest_substring(s: String, k: i32) -> i32 {
let s = s.as_bytes();
(1..=26).fold(0, |mut acc, p| {
let mut cnt = [0; 26];
let mut i = 0;
let mut distinct = 0;
let mut valid = 0;
for j in 0..s.len() {
let right = (s[j] - b'a') as usize;
cnt[right] += 1;
if cnt[right] == 1 { distinct += 1 }
if cnt[right] == k { valid += 1 }
while distinct > p {
let left = (s[i] - b'a') as usize;
cnt[left] -= 1;
if cnt[left] == 0 { distinct -= 1 }
if cnt[left] == k - 1 { valid -= 1 }
i += 1;
}
if distinct == valid { acc = max(acc, (j - i + 1) as i32) }
}
acc
})
}
}Go
go
func longestSubstring(s string, k int) int {
res := 0
for p := 1; p < 27; p++ {
counter := [26]int{}
i, valid, distinct := 0, 0, 0
for j := range s {
J := s[j] - 'a'
counter[J]++
if counter[J] == 1 {
distinct++
}
if counter[J] == k {
valid++
}
for ; distinct > p; i++ {
I := s[i] - 'a'
counter[I]--
if counter[I] == 0 {
distinct--
}
if counter[I] == k-1 {
valid--
}
}
if distinct == valid {
res = max(res, j-i+1)
}
}
}
return res
}424. Longest Repeating Character Replacement
go
go
func characterReplacement(s string, k int) int {
count := [26]int{}
i, maxCount, res := 0, 0, 0
for j := range s {
J := s[j] - 'A'
count[J]++
// largest count of a single, unique character in the current window
maxCount = max(maxCount, count[J])
//too many to replace, shrink the window
for j-i+1-maxCount > k {
count[s[i]-'A']--
i++
}
res = max(res, j-i+1)
}
return res
}java
java
class Solution {
public int characterReplacement(String s, int k) {
int i = 0, maxCount = 0, res = 0, n = s.length();
int[] cnt = new int[n];
for (int j = 0; j < n; j++) {
int J = s.charAt(j) - 'A';
maxCount = Math.max(maxCount, ++cnt[J]);
while (j - i + 1 - maxCount > k) {
cnt[s.charAt(i++) - 'A']--;
}
res = Math.max(res, j - i + 1);
}
return res;
}
}438. Find All Anagrams in a String
java
java
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int w = p.length();
int[] need = new int[26];
for (char c : p.toCharArray())
need[c - 'a']++;
ArrayList<Integer> res = new ArrayList<>();
int valid = 0;
char[] cs = s.toCharArray();
for (int i = 0; i < s.length(); i++) {
int curr = cs[i] - 'a';
if (need[curr] > 0) {
valid++;
}
need[curr]--;
if (i > w - 1) {
int out = cs[i - w] - 'a';
need[out]++;
if (need[out] > 0) valid--;
}
if (i >= w - 1 && valid == w) res.add(i - w + 1);
}
return res;
}
}go
go
func findAnagrams(s string, p string) []int {
w := len(p)
need := [26]int{}
for i := range p {
need[p[i]-'a']++
}
var res []int
valid := 0
for i := range s {
if need[s[i]-'a'] > 0 {
valid++
}
need[s[i]-'a']--
if i > w-1 {
need[s[i-w]-'a']++
if need[s[i-w]-'a'] > 0 {
valid--
}
}
if i >= w-1 && valid == w {
res = append(res, i-w+1)
}
}
return res
}567. Permutation in String
java
java
class Solution {
public boolean checkInclusion(String s1, String s2) {
int[] need = new int[26];
for (char c : s1.toCharArray()) {
need[c - 'a']++;
}
int valid = 0, w = s1.length();
char[] s = s2.toCharArray();
for (int i = 0; i < s2.length(); i++) {
int curr = s[i] - 'a';
if (need[curr] > 0) valid++;
need[curr]--;
if (i > w - 1) {
int out = s[i - w] - 'a';
need[out]++;
if (need[out] > 0) valid--;
}
if (i >= w - 1 && valid == w) return true;
}
return false;
}
}go
go
func checkInclusion(s1 string, s2 string) bool {
need := [26]int{}
for i := range s1 {
need[s1[i]-'a']++
}
w := len(s1)
valid := 0
for i := range s2 {
curr := s2[i] - 'a'
if need[curr] > 0 {
valid++
}
need[curr]--
if i > w-1 {
out := s2[i-w] - 'a'
need[out]++
if need[out] > 0 {
valid--
}
}
if i >= w-1 && valid == w {
return true
}
}
return false
}643. Maximum Average Subarray I
java
java
class Solution {
public double findMaxAverage(int[] nums, int k) {
int sum = 0, res = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (i > k - 1) sum -= nums[i - k];
if (i >= k - 1) res = Math.max(res, sum);
}
return res / 1.0 / k;
}
}go
go
func findMaxAverage(nums []int, k int) float64 {
res, sum := math.MinInt32, 0
for i := range nums {
sum += nums[i]
if i > k-1 {
sum -= nums[i-k]
}
if i >= k-1 {
res = max(res, sum)
}
}
return float64(res) / float64(k)
}713. Subarray Product Less Than K
java
java
class Solution {
public int numSubarrayProductLessThanK(int[] nums, int k) {
int prod = 1, res = 0;
for (int i = 0, j = 0; j < nums.length; j++) {
prod *= nums[j];
while (i <= j && prod >= k) {
prod /= nums[i++];
}
res += j - i + 1;
}
return res;
}
}go
go
func numSubarrayProductLessThanK(nums []int, k int) int {
res, prod, i := 0, 1, 0
for j := range nums {
prod *= nums[j]
for ; i <= j && prod >= k; i++ {
prod /= nums[i]
}
res += j - i + 1
}
return res
}862.Shortest Subarray with Sum at Least K
go
go
func prefix(nums []int) []int {
res := make([]int, len(nums)+1)
for i := range nums {
res[i+1] = nums[i] + res[i]
}
return res
}
func shortestSubarray(nums []int, k int) int {
n := len(nums)
pref := prefix(nums)
res := n + 1
var deque []int
for i := range pref {
for len(deque) > 0 && pref[i]-pref[deque[0]] >= k {
res = min(res, i-deque[0])
deque = deque[1:]
}
for len(deque) > 0 && pref[deque[len(deque)-1]] >= pref[i] {
deque = deque[:len(deque)-1]
}
deque = append(deque, i)
}
if res <= n {
return res
}
return -1
}java
java
class Solution {
public int shortestSubarray(int[] nums, int k) {
int n = nums.length;
int res = n + 1;
long[] pre = new long[n + 1]; // long
for (int i = 0; i < nums.length; i++) {
pre[i + 1] = pre[i] + nums[i];
}
ArrayDeque<Integer> dq = new ArrayDeque<>();
for (int i = 0; i < pre.length; i++) {
while (!dq.isEmpty() && pre[i] - pre[dq.getFirst()] >= k) {
res = Math.min(res, i - dq.pollFirst());
}
while (!dq.isEmpty() && pre[dq.peekLast()] >= pre[i]) {
dq.pollLast();
}
dq.add(i);
}
return res < n + 1 ? res : -1;
}
}python
python
class Solution:
def shortestSubarray(self, nums: List[int], k: int) -> int:
n = len(nums)
pre = [0] * (n + 1)
for i in range(n):
pre[i + 1] = pre[i] + nums[i]
dq = deque()
res = n + 1
for i in range(n + 1):
while dq and pre[i] - pre[dq[0]] >= k:
res = min(res, i - dq.popleft())
while dq and pre[dq[-1]] >= pre[i]:
dq.pop()
dq.append(i)
return res if res <= n else -1904. Fruit Into Baskets
java
java
class Solution {
public int totalFruit(int[] fruits) {
HashMap<Integer, Integer> cnt = new HashMap<>();
int res = 0;
for (int i = 0, j = 0; j < fruits.length; j++) {
cnt.put(fruits[j], cnt.getOrDefault(fruits[j], 0) + 1);
while (cnt.size() > 2) {
cnt.put(fruits[i], cnt.get(fruits[i]) - 1);
cnt.remove(fruits[i++], 0);
}
res = Math.max(res, j - i + 1);
}
return res;
}
}go
go
func totalFruit(fruits []int) int {
i := 0
cnt := make(map[int]int)
res := 0
for j := range fruits {
cnt[fruits[j]]++
for ; len(cnt) > 2; i++ {
cnt[fruits[i]]--
if cnt[fruits[i]] == 0 {
delete(cnt, fruits[i])
}
}
res = max(res, j-i+1)
}
return res
}rust
rust
use std::collections::HashMap;
impl Solution {
pub fn total_fruit(fruits: Vec<i32>) -> i32 {
let mut cnt = HashMap::new();
let i = fruits.iter().fold(0, |mut acc, fruit| {
*cnt.entry(fruit).or_insert(0) += 1;
if cnt.len() > 2 {
let i = &fruits[acc];
*cnt.entry(i).or_default() -= 1;
if cnt[i] == 0 { cnt.remove(i); }
acc += 1;
}
acc
});
(fruits.len() - i) as i32
}
}930. Binary Subarrays With Sum
go
go
func numSubarraysWithSum(nums []int, goal int) int {
return atMost(nums, goal) - atMost(nums, goal-1)
}
func atMost(nums []int, goal int) int {
if goal < 0 {
return 0
}
res, i, sum := 0, 0, 0
for j, num := range nums {
sum += num
for ; sum > goal; i++ {
sum -= nums[i]
}
res += j - i + 1
}
return res
}992. Subarrays with K Different Integers
go
go
func subarraysWithKDistinct(nums []int, k int) int {
return atMost(nums, k) - atMost(nums, k-1)
}
func atMost(nums []int, k int) int {
res, i, cnt := 0, 0, make(map[int]int)
for j, num := range nums {
cnt[num]++
for ; len(cnt) > k; i++ {
cnt[nums[i]]--
if cnt[nums[i]] == 0 {
delete(cnt, nums[i])
}
}
res += j - i + 1
}
return res
}java
java
class Solution {
public int subarraysWithKDistinct(int[] nums, int K) {
return atMostK(nums, K) - atMostK(nums, K - 1);
}
int atMostK(int[] nums, int k) {
int i = 0, res = 0;
HashMap<Integer, Integer> cnt = new HashMap<>();
for (int j = 0; j < nums.length; j++) {
cnt.put(nums[j], cnt.getOrDefault(nums[j], 0) + 1);
while (cnt.size() > k) {
cnt.put(nums[i], cnt.get(nums[i]) - 1);
cnt.remove(nums[i++], 0);
}
res += j - i + 1;
}
return res;
}
}1004. Max Consecutive Ones III
java
java
class Solution {
public int longestOnes(int[] nums, int k) {
int res = 0, cnt = 0;
for (int i = 0, j = 0; j < nums.length; j++) {
if (nums[j] == 0) cnt++;
while (cnt > k && nums[i++] == 0) {
cnt--;
}
res = Math.max(j - i + 1, res);
}
return res;
}
}go
go
func longestOnes(nums []int, k int) int {
res, i, cnt := 0, 0, 0
for j, num := range nums {
if num == 0 {
cnt++
}
for ; cnt > k; i++ {
if nums[i] == 0 {
cnt--
}
}
res = max(res, j-i+1)
}
return res
}1052. Grumpy Bookstore Owner
java
java
class Solution {
public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {
int window = 0, res1 = 0, res2 = 0;
for (int i = 0; i < customers.length; i++) {
if (grumpy[i] == 0) res1 += customers[i];
else window += customers[i];
if (i >= minutes) {
int left = i - minutes;
window -= grumpy[left] * customers[left];
}
res2 = Math.max(res2, window);
}
return res1 + res2;
}
}Go
go
func maxSatisfied(customers []int, grumpy []int, minutes int) int {
res1, res2, window := 0, 0, 0
for i := range customers {
if grumpy[i] == 0 {
res1 += customers[i]
} else {
window += customers[i]
}
if i >= minutes {
window -= grumpy[i-minutes] * customers[i-minutes]
}
res2 = max(res2, window)
}
return res1 + res2
}1234. Replace the Substring for Balanced String
java
java
class Solution {
public int balancedString(String s) {
int i = 0, n = s.length(), k = n / 4, res = n;
int[] cnt = new int[128];
for (int j = 0; j < n; j++) {
cnt[s.charAt(j)]++;
}
for (int j = 0; j < n; j++) {
// erase elements in the window
cnt[s.charAt(j)]--;
while (i < n && cnt['Q'] <= k && cnt['W'] <= k && cnt['E'] <= k && cnt['R'] <= k) {
res = Math.min(j - i + 1, res);
cnt[s.charAt(i++)]++;
}
}
return res;
}
}1248. Count Number of Nice Subarrays
go
go
func numberOfSubarrays(nums []int, k int) int {
return atMost(nums, k) - atMost(nums, k-1)
}
func atMost(nums []int, goal int) int {
res, i, odd := 0, 0, 0
for j, num := range nums {
odd += num & 1
for ; odd > goal; i++ {
odd -= nums[i] & 1
}
res += j - i + 1
}
return res
}java
java
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
return atMost(nums, k) - atMost(nums, k - 1);
}
int atMost(int[] nums, int k) {
int cnt = 0, i = 0, res = 0;
for (int j = 0; j < nums.length; j++) {
cnt += nums[j] & 1;
while (cnt > k) {
cnt -= nums[i++] & 1;
}
res += j - i + 1;
}
return res;
}
}1358. Number of Substrings Containing All Three Characters
go
go
func numberOfSubstrings(s string) int {
cnt := [3]int{}
i := 0
res := 0
for j := range s {
cnt[s[j]-'a']++
for cnt[0] > 0 && cnt[1] > 0 && cnt[2] > 0 {
cnt[s[i]-'a']--
i++
}
res += i
}
return res
}java
java
class Solution {
public int numberOfSubstrings(String s) {
int[] count = {0, 0, 0};
int res = 0, i = 0;
for (int j = 0; j < s.length(); j++) {
count[s.charAt(j) - 'a']++;
while (count[0] > 0 && count[1] > 0 && count[2] > 0) count[s.charAt(i++) - 'a']--;
res += i;
}
return res;
}
}1425.Constrained Subsequence Sum
java
java
class Solution {
public int constrainedSubsetSum(int[] nums, int k) {
int n = nums.length;
int[] dp = Arrays.copyOf(nums, n);
ArrayDeque<Integer> dq = new ArrayDeque<>();
dq.offer(0);
int res = nums[0];
for (int i = 1; i < n; i++) {
if (!dq.isEmpty() && dq.peek() < i - k) {
dq.poll();
}
if (!dq.isEmpty() && dp[dq.peek()] > 0) {
dp[i] += dp[dq.peek()];
}
res = Math.max(res, dp[i]);
while (!dq.isEmpty() && dp[i] >= dp[dq.peekLast()]) {
dq.pollLast();
}
dq.offer(i);
}
return res;
}
}go
go
func constrainedSubsetSum(nums []int, k int) int {
n := len(nums)
dp := make([]int, n)
copy(dp, nums)
dq := []int{0}
res := nums[0]
for i := 1; i < n; i++ {
if dq[0] < i-k {
dq = dq[1:]
}
if dp[dq[0]] > 0 {
dp[i] += dp[dq[0]]
}
res = max(res, dp[i])
for len(dq) > 0 && dp[i] >= dp[dq[len(dq)-1]] {
dq = dq[:len(dq)-1]
}
dq = append(dq, i)
}
return res
}1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
go
go
func longestSubarray(nums []int, limit int) int {
var (
maxQ []int
minQ []int
)
i := 0
for _, num := range nums {
for len(maxQ) > 0 && maxQ[len(maxQ)-1] < num {
maxQ = maxQ[:len(maxQ)-1]
}
for len(minQ) > 0 && minQ[len(minQ)-1] > num {
minQ = minQ[:len(minQ)-1]
}
maxQ = append(maxQ, num)
minQ = append(minQ, num)
if maxQ[0]-minQ[0] > limit {
if maxQ[0] == nums[i] {
maxQ = maxQ[1:]
}
if minQ[0] == nums[i] {
minQ = minQ[1:]
}
i++
}
}
return len(nums) - i
}java
java
int longestSubarray(int[] nums, int limit) {
ArrayDeque<Integer> maxQueue = new ArrayDeque<>();
ArrayDeque<Integer> minQueue = new ArrayDeque<>();
int i = 0;
for (int num : nums) {
while (!maxQueue.isEmpty() && maxQueue.peekLast() < num) maxQueue.pollLast();
while (!minQueue.isEmpty() && minQueue.peekLast() > num) minQueue.pollLast();
maxQueue.offer(num);
minQueue.offer(num);
if (maxQueue.peek() - minQueue.peek() > limit) {
if (maxQueue.peek() == nums[i]) maxQueue.poll();
if (minQueue.peek() == nums[i]) minQueue.poll();
i++;
}
}
return nums.length - i;
}1456. Maximum Number of Vowels in a Substring of Given Length
go
go
func maxVowels(s string, k int) int {
count := 0
res := 0
for i := range s {
if isVowel(s[i]) {
count++
}
if i > k-1 && isVowel(s[i-k]) {
count--
}
res = max(count, res)
}
return res
}
func isVowel(b byte) bool {
switch b {
case 'a', 'e', 'i', 'o', 'u':
return true
default:
return false
}
}java
java
class Solution {
public int maxVowels(String s, int k) {
int count = 0, res = 0;
for (int i = 0; i < s.length(); i++) {
if (isVowel(s.charAt(i))) {
count++;
}
if (i > k - 1 && isVowel(s.charAt(i - k))) {
count--;
}
res = Math.max(res, count);
}
return res;
}
boolean isVowel(char b) {
switch (b) {
case 'a', 'e', 'i', 'o', 'u' -> {
return true;
}
}
return false;
}
}2134. Minimum Swaps to Group All 1's Together II
java
java
class Solution {
public int minSwaps(int[] nums) {
int sum = Arrays.stream(nums).sum();
int count = 0;
int n = nums.length;
int res = sum;
for (int i = 0; i < 2 * n; i++) {
if (nums[i % n] == 0) count++;
if (i > sum - 1 && nums[(i - sum) % n] == 0) count--;
if (i >= sum - 1) res = Math.min(res, count);
}
return res;
}
}