LmaoSuVuong
Senior Member
4 bài hôm nay e giải dc hết, nhưng mà mình Q3 hết tiếng rưỡi r bác. vào live lại gia nhập 2q gang feed cho bác @freedom.9code python đương nhiên ngắn hơn java rồi, vào contest thi luôn chứ fen cho nó lên điểm

4 bài hôm nay e giải dc hết, nhưng mà mình Q3 hết tiếng rưỡi r bác. vào live lại gia nhập 2q gang feed cho bác @freedom.9code python đương nhiên ngắn hơn java rồi, vào contest thi luôn chứ fen cho nó lên điểm

class Solution {
/**
* @param Integer[] $arr
* @return Boolean
*/
function checkIfExist($arr) {
$dict = [];
foreach ($arr as $n) {
if (isset($dict[$n*2])) return true;
if (is_int($n/2) && isset($dict[$n/2])) return true;
$dict[$n] = true;
}
return false;
}
}
class Solution {
public:
bool checkIfExist(vector<int>& arr) {
auto numbers = unordered_set<int>();
for (auto const& num : arr) {
if (numbers.count(num * 2) ||
((num & 1) == 0 && numbers.count(num >> 1))) return true;
numbers.insert(num);
}
return false;
}
};

Cơm thêm https://leetcode.com/problems/find-the-longest-equal-subarray/
Lần đầu tự mò ra beat 100% TC nhưng không hiểu vì sao nó chạy được![]()
class Solution {
public int longestEqualSubarray(List<Integer> nums, int k) {
int l=1;
int r = nums.size();
int ans =1;
while(l<=r){
int mid = l+(r-l)/2;
if(condition( nums, mid,k)){
ans = mid;
l=mid+1;
}else{
r = mid-1;
}
}
return ans;
}
public boolean condition(List<Integer> nums, int len, int k){
Map<Integer,Integer> freq = new HashMap();
int max=0;
for(int i =0 ; i < len+k && i<nums.size();i++){
int num =nums.get(i);
freq.put(num,freq.getOrDefault(num, 0)+1 );
max=Math.max(max, freq.get(num));
if(max>=len) return true;
}
for(int i=len+k;i<nums.size();i++){
int r = nums.get(i);
int l = nums.get(i-len-k);
freq.put(r,freq.getOrDefault(r, 0)+1 );
freq.put(l,freq.get(l)-1 );
max=Math.max(max, freq.get(r));
if(max>=len) return true;
}
return false;
}
}
class Solution {
public int longestEqualSubarray(List<Integer> nums, int k) {
int ans =1;
int l=0;
Map<Integer,Integer> freq = new HashMap();
for(int i =0 ; i<nums.size();i++){
int num =nums.get(i);
freq.put(num,freq.getOrDefault(num, 0)+1 );
while(i-l>ans+k){
freq.put(nums.get(l),freq.get(nums.get(l))-1 );
l++;
}ans=Math.max(ans, freq.get(num));
}
return ans;
}
}


đang học trượt cửa sổ, làm gần hết medium rồi, làm lấy số lượng, đấm hết mấy bài 1k5,1k6,1k7, còn lại mấy bài 1k8 với 2k3,2k5Java:class Solution { public int longestEqualSubarray(List<Integer> nums, int k) { int l=1; int r = nums.size(); int ans =1; while(l<=r){ int mid = l+(r-l)/2; if(condition( nums, mid,k)){ ans = mid; l=mid+1; }else{ r = mid-1; } } return ans; } public boolean condition(List<Integer> nums, int len, int k){ Map<Integer,Integer> freq = new HashMap(); int max=0; for(int i =0 ; i < len+k && i<nums.size();i++){ int num =nums.get(i); freq.put(num,freq.getOrDefault(num, 0)+1 ); max=Math.max(max, freq.get(num)); if(max>=len) return true; } for(int i=len+k;i<nums.size();i++){ int r = nums.get(i); int l = nums.get(i-len-k); freq.put(r,freq.getOrDefault(r, 0)+1 ); freq.put(l,freq.get(l)-1 ); max=Math.max(max, freq.get(r)); if(max>=len) return true; } return false; } }mà sao cơm của bác toàn trượt cửa sổ vlàm cách BS xong nhìn thấy len của cửa sổ = max+k;
Java:class Solution { public int longestEqualSubarray(List<Integer> nums, int k) { int ans =1; int l=0; Map<Integer,Integer> freq = new HashMap(); for(int i =0 ; i<nums.size();i++){ int num =nums.get(i); freq.put(num,freq.getOrDefault(num, 0)+1 ); while(i-l>ans+k){ freq.put(nums.get(l),freq.get(nums.get(l))-1 ); l++; }ans=Math.max(ans, freq.get(num)); } return ans; } }![]()
mai e xem, h đi ngủ thoiCơm thêm: https://leetcode.com/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum
bài này medium mà khoai, ko giải ra![]()
Cơm thêm: https://leetcode.com/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum
bài này medium mà khoai, ko giải ra![]()
class Solution {
public static final int INF = 1_000_000_000;
public int minSumOfLengths(int[] arr, int target) {
List<int[]> subArray = new ArrayList<>();
int end = -1;
int n = arr.length;
int[] lasting = new int[n + 1];
Arrays.fill(lasting, INF);
List<int[]> subsequence = new ArrayList<>();
int sum = 0;
for (int begin = 0; begin < n; begin++) {
while (end + 1 < n) {
if (sum >= target) {
break;
}
end++;
sum += arr[end];
}
if (sum == target) {
lasting[begin] = end - begin + 1;
subsequence.add(new int[]{begin, end});
}
sum -= arr[begin];
}
for (int i = n - 1; i >= 0; i--) {
lasting[i] = Math.min(
lasting[i],
lasting[i + 1]
);
}
int minimum = INF;
for (int[] sequence : subsequence) {
int begin = sequence[0];
end = sequence[1];
minimum = Math.min(
end - begin + 1 + lasting[end + 1],
minimum
);
}
if (minimum == INF) {
return -1;
}
return minimum;
}
}

class Solution:
def characterReplacement(self, s: str, k: int) -> int:
l = 0
max_freq = 0
d = defaultdict(int)
for i in range(len(s)):
d[s[i]] += 1
if max_freq < d[s[i]]:
max_freq = d[s[i]]
if i - l + 1 - max_freq > k:
d[s[l]] -= 1
l += 1
return len(s) - l


Đã từ lâu toy ko còn hứng thú kêu Vozers vô contest nữa rồi4 bài hôm nay e giải dc hết, nhưng mà mình Q3 hết tiếng rưỡi r bác. vào live lại gia nhập 2q gang feed cho bác @freedom.9![]()
Cơm thêm: https://leetcode.com/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum
bài này medium mà khoai, ko giải ra![]()
class Solution:
def minSumOfLengths(self, arr: List[int], target: int) -> int:
n = len(arr)
def rightToLeft():
dp = [-1]*n
count = defaultdict(int)
count[0] = n
sumSofar = 0
currentMin = inf
for i in range(n - 1, -1, -1):
sumSofar += arr[i]
count[sumSofar] = i
if sumSofar - target in count:
currentMin = min(currentMin, count[sumSofar - target] - i)
dp[i] = currentMin
return dp
rightToLeftDp = rightToLeft()
count = defaultdict(int)
count[0] = -1
sumSofar = 0
currentMin = inf
ans = inf
for i in range(n - 1):
sumSofar += arr[i]
count[sumSofar] = i
if sumSofar - target in count and rightToLeftDp[i + 1] != inf:
ans = min(ans, i - count[sumSofar - target] + rightToLeftDp[i + 1])
return -1 if ans == inf else ans
Bác @freedom.9 có premium cho e lời giải thích cho lời giải bài này, cực khó hiểu, O(N)
Python:class Solution: def characterReplacement(self, s: str, k: int) -> int: l = 0 max_freq = 0 d = defaultdict(int) for i in range(len(s)): d[s[i]] += 1 if max_freq < d[s[i]]: max_freq = d[s[i]] if i - l + 1 - max_freq > k: d[s[l]] -= 1 l += 1 return len(s) - l
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
start = 0
frequency_map = {}
max_frequency = 0
longest_substring_length = 0
for end in range(len(s)):
frequency_map[s[end]] = frequency_map.get(s[end], 0) + 1
# the maximum frequency we have seen in any window yet
max_frequency = max(max_frequency, frequency_map[s[end]])
# move the start pointer towards right if the current
# window is invalid
is_valid = (end + 1 - start - max_frequency <= k)
if not is_valid:
frequency_map[s[start]] -= 1
start += 1
# the window is valid at this point, store length
# size of the window never decreases
longest_substring_length = end + 1 - start
return longest_substring_length
class Solution:
def characterReplacement(self, s: str, k: int) -> int:
n = len(s)
def slidingWindow(target):
ans = k
left = 0
currentChange = 0
for right in range(n):
if s[right] != target:
currentChange += 1
while currentChange > k:
if s[left] != target:
currentChange -= 1
left += 1
ans = max(ans, right - left + 1)
return ans
ans = 0
letters = set(s)
for char in letters:
ans = max(ans, slidingWindow(char))
return ans
def build_row_graph(mat):
m = len(mat)
n = len(mat[0])
adj = [defaultdict(list) for _ in range(m)]
for r in range(m):
pairs = sorted([(mat[r][c], c) for c in range(n)])
i, j = 0, 0
while i < n:
while j < n and pairs[i][0] >= pairs[j][0]:
j += 1
if j == n:
break
adj[r][pairs[j][0]].append((r, pairs[i][1]))
i += 1
return adj
def build_col_graph(mat):
m = len(mat)
n = len(mat[0])
adj = [defaultdict(list) for _ in range(n)]
for c in range(n):
pairs = sorted([(mat[r][c], r) for r in range(m)])
i, j = 0, 0
while i < m:
while j < m and pairs[i][0] >= pairs[j][0]:
j += 1
if j == m:
break
adj[c][pairs[j][0]].append((pairs[i][1], c))
i += 1
return adj
class Solution:
def maxIncreasingCells(self, mat: List[List[int]]) -> int:
m = len(mat)
n = len(mat[0])
adj_row = build_row_graph(mat)
adj_col = build_col_graph(mat)
@lru_cache(maxsize=None)
def dp_row(r, value):
d = 1
for u, v in adj_row[r][value]:
d = max(d, dp(u, v) + 1)
return d
@lru_cache(maxsize=None)
def dp_col(c, value):
d = 1
for u, v in adj_col[c][value]:
d = max(d, dp(u, v) + 1)
return d
@lru_cache(maxsize=None)
def dp(r, c):
value = mat[r][c]
return max(dp_row(r, value), dp_col(c, value))
res = max(
dp(r, c) for r in range(m) for c in range(n)
)
dp_row.cache_clear()
dp_col.cache_clear()
dp.cache_clear()
return res
Bài này lấy ý tưởng tìm subarray ngắn nhất tổng bằng target thôiCơm thêm: https://leetcode.com/problems/find-two-non-overlapping-sub-arrays-each-with-target-sum
bài này medium mà khoai, ko giải ra![]()
class Solution:
def minSumOfLengths(self, arr: List[int], target: int) -> int:
INF = 10**9
def sliding_window(nums):
d = dict()
d[0] = -1
total = 0
f = [INF] * len(nums)
for i, num in enumerate(nums):
total += num
if total - target in d:
f[i] = i - d[total-target]
d[total] = i
for i in range(1, len(nums)):
f[i] = min(f[i-1], f[i])
return f
l = sliding_window(arr)
r = list(reversed(sliding_window(list(reversed(arr)))))
res = INF
for i in range(len(arr) - 1):
res = min(res, l[i] + r[i+1])
return res if res != INF else -1
/**
* @param {string} sentence
* @param {string} searchWord
* @return {number}
*/
var isPrefixOfWord = function(sentence, searchWord) {
let arr = sentence.split(' ');
for (let i=0; i<arr.length; i++) {
if (arr[i].substring(0, searchWord.length) === searchWord)
return i+1;
}
return -1;
};