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++:
class Solution {
public:
    int minOperations(vector<int>& nums) {
        cin.tie(0); cout.tie(0); ios::sync_with_stdio(0);
        unordered_map<int, int> cnt;
        for(int& num : nums)
            cnt[num]++;
        int n3, n2, res = 0;
        for(auto& [num, occ] : cnt) {
            n3 = occ / 3;
            if(occ % 3 == 2)
                res += n3 + (occ - n3 * 3) / 2;
            else if(occ % 3 == 1) {
                n3--;
                n2 = (occ - n3 * 3) / 2;
                if(n3 < 0 || n3 * 3 + n2 * 2 != occ)
                    return - 1;
                res += n3 + n2;
            }
            else
                res += n3;
        }
        return res;
    }
};
 
Thím bổ vào cái set submib pass rồi post ảnh vô đây xem nào :LOL:)
Mã:
class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        num_set = set()
        for num in nums:
            if num >= 0:
                num_set.add(num)
        k = 1
        while k in num_set:
            k+=1
        return k
của bác đang làm là O(n) space và O(n) time như t luôn mà
 
Bài này mình ngồi nghĩ 1 lúc nó ra ảo thiệt :shame: ngồi 1 lúc thấy tận dụng đc cái đống index của array để làm 0(n) :adore: nhiều bài hard sẽ làm được nếu ko bỏ cuộc

via theNEXTvoz for iPhone
Thực ra không khó đâu, có cả lý thuyết toán học để làm cái này.
Riêng mình thì việc biến đổi input còn tệ hơn là O(n). Trong thực tế không ai biến đổi input cả.
 
Bài này mình ngồi nghĩ 1 lúc nó ra ảo thiệt :shame: ngồi 1 lúc thấy tận dụng đc cái đống index của array để làm 0(1) :adore: nhiều bài hard sẽ làm được nếu ko bỏ cuộc

via theNEXTvoz for iPhone
Xin được vợ con máy tính đây.
Không biết có cách nào không sửa array ban đầu mới gọi là ảo

Python:
class Solution:
    def firstMissingPositive(self, nums):
        n = len(nums)
        for i in range(n):
            if nums[i] < 1 or nums[i] > n:
                nums[i] = n+1
        for i in range(n):
            if abs(nums[i]) > 0 and abs(nums[i]) <= n:
                nums[abs(nums[i]) - 1] = -1* abs(nums[abs(nums[i]) - 1])
        for i in range(n):
            if nums[i] > 0:
                return i + 1
        return n+1
 
nghịch thử ruby :beauty:
Ruby:
def min_operations(nums)
  nums.tally
  .inject(0) do |s, map|
    return -1 if m[1] == 1
    s += (m[1] / 3.0).ceil
  end
end
 
Giải dp trước đã, cái solution O(nlogn) nghi ngờ nhân sinh vl :beat_brick: :sweat:
Python:
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        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])

        ans = 0
        for i in range(len(dp)):
            ans = max(dp[i], ans)

        return ans
 
Sửa lần cuối:
Giải O(n2) xong mất 1 tiếng không nghĩ nổi O(nlog), vào Solution thấy bác Mai Thanh Hiep làm phát 4 solution được mở mang luôn :) toàn kiến thức chuyên tin
 
Giải dp trước đã, cái solution O(nlogn) nghi ngờ nhân sinh vl :beat_brick: :sweat:
Python:
class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        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])

        ans = 0
        for i in range(len(dp)):
            ans = max(dp[i], ans)

        return ans
Chưa làm nhưng mạnh dạn đoán nếu từ O(n^2) xuống O(nlogn) thì chắc là có binary search rồi :shame:
 
JavaScript:
function lengthOfLIS(nums: number[]): number {
    const n = nums.length;
    const dp = new Array(n).fill(1);
    for (let i = 0; i < n; i++) {
        for (let j = 0; j < i; j++) {
            if (nums[i] > nums[j] && dp[i] < dp[j] + 1) {
                dp[i] = dp[j] + 1;
            }
        }
    }
    return Math.max(...dp);
};
Code rác O(n^2) :shame:
Bài này là classic DP, dùng DP là hợp lý rồi :hungry:
 
  • Tạo Arr res: với res[i-1] là giá trị cuối nhỏ nhất của dãy tăng có i phần tử. Vd dãy 2 phần tử có [1, 4] [1,5] [2,3] thì res[i-1]=3
  • Khởi tạo res[0] = nums[0]
  • Với mỗi nums, nếu nums > res[-1] thì append nums vào res. Ngược lại tìm j sao cho res[j] >= nums và res[j-1] < num
Gán res[j-1] = num
KQ là len(res)
Đoạn tìm là log n
 
JavaScript:
var lengthOfLIS = function (nums) {
    const dp = new Array(nums.length).fill(1);
    for (let i = 1; i < nums.length; i++) {
        for (let j = 0; j < i; j++) {
            if (nums[i] > nums[j]) {
                dp[i] = Math.max(dp[i], dp[j] + 1);
            }
        }
    }
    return Math.max(...dp);
};
 
DP cơ bản
C++:
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int res = 1;
        vector<int> dp(nums.size(), 1);
        for(int i = 1; i < nums.size(); ++i) {
            for(int j = 0; j < i; ++j) {
                if(nums[i] > nums[j]) {
                    dp[i] = max(dp[i], dp[j] + 1);
                }
            }
            res = max(dp[i], res);
        }
        return res;
    }
};
 
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.212.956
Quay lại
Lên đầu trang