thảo luận Leetcode mỗi ngày

  • Người tạo chủ đề Người tạo chủ đề _Gia_Cat_Luong_
  • Ngày bắt đầu Ngày bắt đầu
Trạng thái
Không mở để trả lời thêm.
Cũng chưa chắc, cứ đặt target của mình phù hợp với năng lực rồi đi pv, ko việc gì phải đi lấy lòng cty cả. Với tâm thế ko có job này cũng có job khác, tạch thì review lại xem mình còn yếu phần nào rồi cải thiện thôi. Cứ trả lời honest là được rồi.
1 cuộc phỏng vấn chỉ khoảng 60ph nên phần nhiều những lần tạch ko phải do vấn đề technical đâu mà là do giao tiếp, thái độ là chính. Cứ trung thực, biết nói I don't know đúng lúc, ko vòng vo, chịu học, chịu hỏi, ko láo nhăm nhe đấm interviewer là phần lớn có nhiều cơ hội đi vào vòng trong rồi. Còn những cty nó ko chấp nhận yếu tố honesty thì cũng ko nên vô làm gì.
Mình cũng ít đi phỏng vấn nhưng từ hồi đi pv senior là hầu như lần pv nào cũng pass cả, có lần phỏng vấn system design trước xong phỏng vấn tạch live coding nhưng vẫn pass, đó là lí do tại sao mình quyết tâm học Leetcode nghiêm túc :beat_brick:
Cảm ơn thím, qua đợt này e cũng có thêm nhiều kinh nghiệm pv rồi. Leetcode/paircode/behavior. Cũng nhờ theo thớt leetcode này. Có sys design là chưa được rớ :D
 
Sửa lần cuối:
Đang làm lương ổn mắc gì nghỉ, tuyển fen vào rồi lương ổn fen nghỉ tiếp sao
c6GVp0o.png
Cũng có bị hỏi câu đó, e bảo lương ổn mà tech cũ + nhàn quá :pudency:
 
Peak Element = Binary Search/ 2 Pointers (thấy đa số bài là vậy :beauty: )
Như bài này thì tính LIS, LDS sau đó thì tính max tổng 2 thằng là đc :ah:
JavaScript:
function minimumMountainRemovals(nums: number[]): number {
    const n = nums.length;
    const bs = (arr: number[], target: number): number => {
        let left = 0, right = arr.length;
        while (left < right) {
            const mid = Math.floor((left + right) / 2);
            if (arr[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
    const LIS = new Array(n).fill(0);
    const lisArr: number[] = [];
    for (let i = 0; i < n; i++) {
        const idx = bs(lisArr, nums[i]);
        if (idx === lisArr.length) {
            lisArr.push(nums[i]);
        } else {
            lisArr[idx] = nums[i];
        }
        LIS[i] = idx + 1;
    }
    const LDS = new Array(n).fill(0);
    const ldsArr: number[] = [];
    for (let i = n - 1; i >= 0; i--) {
        const idx = bs(ldsArr, nums[i]);
        if (idx === ldsArr.length) {
            ldsArr.push(nums[i]);
        } else {
            ldsArr[idx] = nums[i];
        }
        LDS[i] = idx + 1;
    }

    let res = 0;
    for (let i = 1; i < n - 1; i++) {
        if (LIS[i] > 1 && LDS[i] > 1) {
            res = Math.max(res, LIS[i] + LDS[i] - 1);
        }
    }
    return n - res;
}
 
C++:
class Solution {
    vector<int> _di;// _pi; //increase
    vector<int> _dd;// _pd; //decrease
public:
    int minimumMountainRemovals(vector<int>& nums) {
        lis(nums);
        lds(nums);
        int longestMountain = 0;
        for (int i = 0; i < nums.size(); ++i) {
            if (_di[i] > 1 && _dd[i] > 1) {           
                longestMountain = max(longestMountain, _di[i] + _dd[i] - 1);
            }
        }
        int ret = nums.size() - longestMountain;
        return ret;
    }

private:
    void lis(const vector<int>& nums) {
        int n = nums.size();
        vector<int> d(n, 1);
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                if (nums[j] < nums[i] && d[i] < d[j] + 1) {
                    d[i] = d[j] + 1;
                }
            }
        }
        swap(_di, d);
    }

    void lds(const vector<int>& nums) {
        int n = nums.size();
        vector<int> d(n, 1);
        for (int i = n - 1; i >= 0; --i) {
            for (int j = n-1; j > i; --j) {
                if (nums[j] < nums[i] && d[i] < d[j] + 1) {
                    d[i] = d[j] + 1;
                }
            }
        }
        swap(_dd, d);
    }
};
 
C++:
class Solution {
public:
    int minimumMountainRemovals(vector<int>& nums) {
        int n = nums.size();
        vector<int> dpIncrease(n, 1);

        for (int i = 1; i < n; i++) {
            for (int k = 0; k < i; k++) {
                if (nums[i] > nums[k]) {
                    dpIncrease[i] = max(dpIncrease[i], dpIncrease[k] + 1);
                }
            }
        }

        vector<int> dpDecrease(n, 1);

        for (int i = n - 2; i >= 0; i--) {
            for (int k = n - 1; k > i; k--) {
                if (nums[i] > nums[k]) {
                    dpDecrease[i] = max(dpDecrease[i], dpDecrease[k] + 1);
                }
            }
        }

        int ans = 0;

        for (int i = 1; i <= n - 2; i++) {
            if (dpIncrease[i] > 1 && dpDecrease[i] > 1) {
                ans = max(ans, dpIncrease[i] + dpDecrease[i] - 1);
            }
        }

        return n - ans;
    }
};
 
ủa lmao huynh mà giờ này cũng thất nghiệp à. Thị trường trong đó cũng ảm đạm vậy sao.
KE5ti7l.png

Mẹ sống ở đất nước ko tạo ra đc việc làm đúng là quá khổ. Giờ nằm thẳng đợi Cảng đưa đất nước tiến lên XHCN thôi
UKiCiKh.png
Mao huynh ở nhà bán khóa học udemy là giầu rồi đi làm culi làm rì cho mệt
 
Python:
class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        n = len(nums)

        def findLIS(arr):
            dp = [1] * n
            for i in range(n):
                for j in range(i):
                    if arr[i] > arr[j] and dp[i] < dp[j] + 1:
                        dp[i] = dp[j] + 1
            return dp
        
        lis, lds = findLIS(nums), findLIS(nums[::-1])[::-1]

        maxMountLen = 0
        for i in range(1, n - 1):
            if lis[i] > 1 and lds[i] > 1:
                maxMountLen = max(maxMountLen, lis[i] + lds[i] - 1)
        return n - maxMountLen
 
Python:
class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        def lis(nums):
            dp = [1]*len(nums)
            for i in range(1, len(nums)):
                for j in range(i):
                    if nums[i] > nums[j]:
                        dp[i] = max(dp[i], 1 + dp[j])
            return dp
        dp1 = lis(nums)
        dp2 = lis(nums[::-1])
        ans = inf
        n = len(nums)
        for i in range(1, len(nums) - 1):
            if dp1[i] > 1 and dp2[n - i - 1] > 1:
                ans = min(ans, n - (dp1[i] + dp2[n - i - 1] - 1))
      
        return ans

Python:
class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        def lis(nums):
            n = len(nums)
            dp = [0]*n
            res = []
            for i in range(n):
                if not res or nums[i] > res[-1]:
                    res.append(nums[i])
                    dp[i] = len(res)

                else:
                    pos = bisect_left(res, nums[i])
                    dp[i] = pos + 1
                    res[pos] = nums[i]

            return dp

        dp1 = lis(nums)
        dp2 = lis(nums[::-1])
        ans = inf
        n = len(nums)
        for i in range(1, len(nums) - 1):
            if dp1[i] > 1 and dp2[n - i - 1] > 1:
                ans = min(ans, n - (dp1[i] + dp2[n - i - 1] - 1))
       
        return ans
Má nó Leecode đi DP ảo quá nhỉ, chôm mới được :ah:
 
Sửa lần cuối:
JavaScript:
var minimumMountainRemovals = function (nums) {
    const n = nums.length;
    let ans = -1;
    const count = nums => {
        const res = [], arr = [];
        for (let i = 0; i < n; i++) {
            const idx = res[i] = _.sortedIndex(arr, nums[i]);
            if (idx >= 0) {
                arr[idx] = Math.min(arr[idx] ?? +Infinity, nums[i]);
            }
        }
        return res;
    };

    const u = count(nums), v = count(nums.reverse());
    for (let i = 0; i < n; i++) {
        ans = Math.max(ans, u[i] && v[n-1-i] ? u[i] + v[n-1-i] + 1: -1);
    }
    return n - ans;
};
 
Python:
class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        def lis(nums):
            dp = [1]*len(nums)
            for i in range(1, len(nums)):
                for j in range(i):
                    if nums[i] > nums[j]:
                        dp[i] = max(dp[i], 1 + dp[j])
            return dp
        dp1 = lis(nums)
        dp2 = lis(nums[::-1])
        ans = inf
        n = len(nums)
        for i in range(1, len(nums) - 1):
            if dp1[i] > 1 and dp2[n - i - 1] > 1:
                ans = min(ans, n - (dp1[i] + dp2[n - i - 1] - 1))
     
        return ans

Python:
class Solution:
    def minimumMountainRemovals(self, nums: List[int]) -> int:
        def lis(nums):
            n = len(nums)
            dp = [0]*n
            res = []
            for i in range(n):
                if not res or nums[i] > res[-1]:
                    res.append(nums[i])
                    dp[i] = len(res)

                else:
                    pos = bisect_left(res, nums[i])
                    dp[i] = pos + 1
                    res[pos] = nums[i]

            return dp

        dp1 = lis(nums)
        dp2 = lis(nums[::-1])
        ans = inf
        n = len(nums)
        for i in range(1, len(nums) - 1):
            if dp1[i] > 1 and dp2[n - i - 1] > 1:
                ans = min(ans, n - (dp1[i] + dp2[n - i - 1] - 1))
      
        return ans
Má nó Leecode đi DP ảo quá nhỉ, chôm mới được :ah:
reverse cái dp2 luôn đi bác phi, nhìn n - i - 1 chíu khọ quá :rolleyes:
 
Java:
class Solution {
    public int minimumMountainRemovals(int[] nums) {
        int n = nums.length;
        int[] dp1 = new int[n];
        Arrays.fill(dp1, 1);
        int[] dp2 = new int[n];
        Arrays.fill(dp2, 1);
        int min = (int) 1e5;
        for (int i = 0, j = n - 1; i < n && j >= 0; i++, j--) {
            for (int k = 0; k < i; k++) {               
                if (nums[k] < nums[i]) dp1[i] = Math.max(dp1[i], dp1[k] + 1);
            }
            for (int k = j + 1; k < n; k++) {
                if (nums[k] < nums[j]) {
                    dp2[j] = Math.max(dp2[j], dp2[k] + 1);
                }
            }
        }
        for (int i = 0; i < n; i++) {
            if (dp1[i] > 1 && dp2[i] > 1)
                min = Math.min(min, n + 1 - dp1[i] - dp2[i]);
        }
        return min;
    }
}
 
Trạng thái
Không mở để trả lời thêm.

Thống kê chủ đề

Ngày tạo
_Gia_Cat_Luong_,
Người trả lời cuối
Vipluckystar,
Trả lời
17.755
Lượt xem
1.214.030
Quay lại
Lên đầu trang