đi interview code ẩu ko cover edge cases chắc tạch sml. Cơ mà ngu quá xài 2 pointers như editorial đỡ phải pop phát mệtclass Solution:
def findLengthOfShortestSubarray(self, arr: List[int]) -> int:
increasing = [0]
n = len(arr)
for i in range(1, n):
if arr[i] >= arr[i - 1]:
increasing.append(i)
else:
break
ans = n - len(increasing)
for j in range(n - 1, -1, -1):
if j != n - 1 and arr[j] > arr[j + 1]:
break
while increasing and (increasing[-1] >= j or arr[increasing[-1]] > arr[j]):
increasing.pop()
if increasing:
ans = min(ans, j - increasing[-1] - 1)
ans = min(ans, j)
return ans
hoá ra monotonic stack là như nàyGặp mấy bài này ăn bug smlđi interview code ẩu ko cover edge cases chắc tạch sml. Cơ mà ngu quá xài 2 pointers như editorial đỡ phải pop phát mệt
Python:class Solution: def findLengthOfShortestSubarray(self, arr: List[int]) -> int: increasing = [0] n = len(arr) for i in range(1, n): if arr[i] >= arr[i - 1]: increasing.append(i) else: break ans = n - len(increasing) for j in range(n - 1, -1, -1): if j != n - 1 and arr[j] > arr[j + 1]: break while increasing and (increasing[-1] >= j or arr[increasing[-1]] > arr[j]): increasing.pop() if increasing: ans = min(ans, j - increasing[-1] - 1) ans = min(ans, j) return ans

Thực ra nếu trong contests thì mình sẽ xài binary search ngay đó éo nói nhiều, vì kiểu gì biết làm On cũng lỗi lên lỗi xuống cho xem.dis bài làm cũng căng đét, lỗi lên lỗi xuống.
Nhìn cái topic còn có cả bs, monotonic stack???
JavaScript:function findLengthOfShortestSubarray(arr: number[]): number { const n = arr.length; let l = 0, r = n - 1; while (l + 1 < n && arr[l] <= arr[l + 1]) l++; if (l === r) return 0; while (r > 0 && arr[r - 1] <= arr[r]) r--; let res = Math.min(n - l - 1, r); for (let i = 0, j = r; i <= l && j < n;) { if (arr[i] <= arr[j]) res = Math.min(res, j - i - 1), i++; else j++; } return res; };

bài này implement BS như nào thế fen, e chỉ biết úp BS cho mấy cái sortedThực ra nếu trong contests thì mình sẽ xài binary search ngay đó éo nói nhiều, vì kiểu gì biết làm On cũng lỗi lên lỗi xuống cho xem.
Còn binary thì khác gì chạy brute force đâu![]()
mình nghĩ là dùng BS trên từng đoạn từ mid to n or từ 0 to mid, rồi tìm xem phần tử nào >= or <= cái half còn lại rồi cộng tính max, cũng khá là khoai, chưa implement đc theo kiểu này.bài này implement BS như nào thế fen, e chỉ biết úp BS cho mấy cái sorted![]()
var findLengthOfShortestSubarray = function (arr) {
const n = arr.length;
let i = 1, j = n, maxLength = 0;
for (; i < n && arr[i] >= arr[i - 1]; i++);
for (; i >= 0; i--) {
const low = i ? arr[i - 1] : -Infinity;
while (j > i && arr[j - 1] <= (arr[j] ?? Infinity) && arr[j - 1] >= low) {
j--;
}
maxLength = Math.max(maxLength, i + n - j);
}
return n - maxLength;
};
Có gì chỉ Cố làm bài nhaclass Solution {
public int minimizedMaximum(int n, int[] quantities) {
int right = IntStream.of(quantities).max().orElseThrow();
int left = 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (check(mid, n, quantities)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private boolean check(int mid, int n, int[] quantities) {
int count = 0;
for (int num: quantities) {
count += (num + mid - 1) / mid;
}
return count <= n;
}
}
mấy tháng rồi sao vẫn Junior vậy Cố huynhHi các bác, Cố mới tái hóa nhập cộng đồngCó gì chỉ Cố làm bài nha
Java:class Solution { public int minimizedMaximum(int n, int[] quantities) { int right = IntStream.of(quantities).max().orElseThrow(); int left = 1; while (left < right) { int mid = left + (right - left) / 2; if (check(mid, n, quantities)) { right = mid; } else { left = mid + 1; } } return left; } private boolean check(int mid, int n, int[] quantities) { int count = 0; for (int num: quantities) { count += (num + mid - 1) / mid; } return count <= n; } }
Kiểu thế này nè mấy fenbài này implement BS như nào thế fen, e chỉ biết úp BS cho mấy cái sorted![]()
class Solution:
def findLengthOfShortestSubarray(self, arr: List[int]) -> int:
n = len(arr)
left = 0
while left + 1 < n and arr[left] <= arr[left + 1]:
left += 1
if left == n - 1:
return 0
right = n - 1
while right > 0 and arr[right - 1] <= arr[right]:
right -= 1
def canRemove(length):
for i in range(left, -1, -1):
j = i + length + 1
if j >= n or (j >= right and arr[i] <= arr[j]):
return True
return False
low, high = 0, n
while low <= high:
mid = low + (high - low) // 2
if canRemove(mid):
high = mid - 1
else:
low = mid + 1
return min(right, high + 1)
class Solution:
def findLengthOfShortestSubarray(self, arr: List[int]) -> int:
n = len(arr)
left = 0
for i in range(1, n):
if arr[i] >= arr[i - 1]:
left = i
else:
break
decreasing = set()
decreasing.add(n - 1)
right = n - 1
for i in range(n - 2, -1, -1):
if arr[i] <= arr[i + 1]:
right = i
decreasing.add(i)
else:
break
def canRemove(length):
for i in range(left, -1, -1):
j = i + length + 1
if j >= n or (j in decreasing and arr[j] >= arr[i]):
return True
return False
low, high = 0, n
while low <= high:
mid = low + (high - low) // 2
if canRemove(mid):
high = mid - 1
else:
low = mid + 1
return min(right, high + 1)
Tặng Cố huynh 1 gạch ủng hộ.Cố cũng chỉ sinh hoạt trong đây thôinên k có nhu cầu lên Sen
Gạch đá thì thôi chống cự quen rồi, chấp nhận số phận![]()
![]()

thì ra là cố huynh máu MCố cũng chỉ sinh hoạt trong đây thôinên k có nhu cầu lên Sen
Gạch đá thì thôi chống cự quen rồi, chấp nhận số phận![]()
![]()
Ko phải fen, đây gọi là binary search on the answer, giả sử remove đc 10 thằng để tạo ra good array, xong giảm search space xuống 5 thằng để tìm xem có tạo ra good array được ko. Nếu remove 3 thằng mà ko tạo đc sub array thì ans nó phải là remove > 3 thằng. Kiểu thế, chứ ko nhất thiết phải deploy trên 1 sorted array mà là deploy trên tập kết quả. Như bài hôm qua đómình nghĩ là dùng BS trên từng đoạn từ mid to n or từ 0 to mid, rồi tìm xem phần tử nào >= or <= cái half còn lại rồi cộng tính max, cũng khá là khoai, chưa implement đc theo kiểu này.
func findLengthOfShortestSubarray(arr []int) int {
l := len(arr)
if l <= 1 { return 0 }
i, j := 0, l-1
for i < l-1 && arr[i+1] >= arr[i] { i++ }
for j > 0 && arr[j] >= arr[j-1] { j-- }
if i >= j { return 0 }
return bsR(arr, i, j)
}
func bsR(arr []int, i int, j int) int {
if arr[i] <= arr[j] { return j - i - 1 }
if i == 0 || j == len(arr)-1 { return j - i }
return min(bsR(arr, i-1, j), bsR(arr, i, j+1))
}
Code O(n) cũng dễ mà,Gặp mấy bài này ăn bug smlđi interview code ẩu ko cover edge cases chắc tạch sml. Cơ mà ngu quá xài 2 pointers như editorial đỡ phải pop phát mệt
Python:class Solution: def findLengthOfShortestSubarray(self, arr: List[int]) -> int: increasing = [0] n = len(arr) for i in range(1, n): if arr[i] >= arr[i - 1]: increasing.append(i) else: break ans = n - len(increasing) for j in range(n - 1, -1, -1): if j != n - 1 and arr[j] > arr[j + 1]: break while increasing and (increasing[-1] >= j or arr[increasing[-1]] > arr[j]): increasing.pop() if increasing: ans = min(ans, j - increasing[-1] - 1) ans = min(ans, j) return ans

class Solution {
public:
int findLengthOfShortestSubarray(vector<int>& arr) {
int j = arr.size() - 1;
for (; j > 0 && arr[j] >= arr[j-1]; --j);
int ret = j;
for (int i = 0; i < j && j <= arr.size(); ++i) {
if (i > 0 && arr[i] < arr[i-1]) break;
while (j < arr.size() && arr[i] > arr[j]) ++j;
ret = min(ret, j - i - 1);
}
return ret;
}
};

Code ẩu là sẽ ăn bọ ăn gậyCode O(n) cũng dễ mà,
T code O(n) submit phát ăn ngay, beast 100%
C++:class Solution { public: int findLengthOfShortestSubarray(vector<int>& arr) { int j = arr.size() - 1; for (; j > 0 && arr[j] >= arr[j-1]; --j); int ret = j; for (int i = 0; i < j && j <= arr.size(); ++i) { if (i > 0 && arr[i] < arr[i-1]) break; while (j < arr.size() && arr[i] > arr[j]) ++j; ret = min(ret, j - i - 1); } return ret; } };
Xem tệp đính kèm 2783071
Có 3 cái submit từ 2022,![]()

bác này chưa đọc BS chân kinh r @anoldvozer1710.v2mình nghĩ là dùng BS trên từng đoạn từ mid to n or từ 0 to mid, rồi tìm xem phần tử nào >= or <= cái half còn lại rồi cộng tính max, cũng khá là khoai, chưa implement đc theo kiểu này.
Hiểu rồi bác, em nghĩ vậy thôi chứ chưa code đc cái solution này.Ko phải fen, đây gọi là binary search on the answer, giả sử remove đc 10 thằng để tạo ra good array, xong giảm search space xuống 5 thằng để tìm xem có tạo ra good array được ko. Nếu remove 3 thằng mà ko tạo đc sub array thì ans nó phải là remove > 3 thằng. Kiểu thế, chứ ko nhất thiết phải deploy trên 1 sorted array mà là deploy trên tập kết quả. Như bài hôm qua đó
via theNEXTvoz for iPhone
Cũng có đọc rồi bác cơ mà bài này dùng BS thì có vẻ giống tự bắn vào chân quábác này chưa đọc BS chân kinh r @anoldvozer1710.v2![]()

Hiểu rồi bác, em nghĩ vậy thôi chứ chưa code đc cái solution này.
Cũng có đọc rồi bác cơ mà bài này dùng BS thì có vẻ giống tự bắn vào chân quá![]()