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

Má nó các anh sao code 1 dòng, chơi vậy ai chơi lại

Code:
func zeroFilledSubarray(nums []int) int64 {
    var count, total uint
    for _, num := range nums {
        if num != 0 {
            count = 0
        } else {
            count += 1
        }
        total += count
    }
    return int64(total)
}
 
JavaScript:
/**
 * @param {number[]} nums
 * @return {number}
 */
var zeroFilledSubarray = function(nums) {
  let n = 0;
  let lt = 1;
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] == 0) {
      n += lt;
      lt++;
    }
    else {
      lt = 1;
    }
  }
  return n;
};
 
Cùng một thuật toán Go lại chạy nhanh hơn và dùng ít bộ nhớ hơn C :) Đó giờ mình cứ nghĩ C nhanh nhất rồi.
1679388134873.png

1679388159754.png
 
các bác cho em hỏi bài "162. Find Peak Element"

em không hiểu đoạn neighboor nó là gì mà em làm theo cách tìm index của số lớn nhất trong mảng. Chả hiểu sao lại passed các bác ạ :(

Các bác có đáp án với giải thích cho bài này không giúp em với. Em cảm ơn các bác

Code:
/**
 * @param {number[]} nums
 * @return {number}
 */
var findPeakElement = function(nums) {
    let max = nums[0];
    let node = 0;
    if(nums.length > 0){
        for(let i = 1; i< nums.length; i++){
            if(max < nums[i]){
                max = nums[i];
                node = i;
            }
        }
    }
    return node
};
1679390728761.png
 
các bác cho em hỏi bài "162. Find Peak Element"

em không hiểu đoạn neighboor nó là gì mà em làm theo cách tìm index của số lớn nhất trong mảng. Chả hiểu sao lại passed các bác ạ :(

Các bác có đáp án với giải thích cho bài này không giúp em với. Em cảm ơn các bác

Code:
/**
 * @param {number[]} nums
 * @return {number}
 */
var findPeakElement = function(nums) {
    let max = nums[0];
    let node = 0;
    if(nums.length > 0){
        for(let i = 1; i< nums.length; i++){
            if(max < nums[i]){
                max = nums[i];
                node = i;
            }
        }
    }
    return node
};
View attachment 1730932
thím làm phức tạp quá, bài này chỉ cần tìm i sao cho nums > nums[i+1] là được rồi. TC sẽ là O(n).
Còn nếu muốn đc O(logn) thì phải dùng Binary Search để giải
 
Code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[101][50001];
const int mod = 1e9 + 7;
ll countRec(int n, int sum)
{
    if (!sum)
        return 0;
    if (n == 1)
        return 1;
    if (dp[n][sum] != -1)
        return dp[n][sum];
    ll ans = 0;
    for (int i = 0; i < 10; i++)
    {
        if (sum - i >= 0)
        {
            ans += (countRec(n - 1, sum - i)) % mod;
        }
    }
    dp[n][sum] = ans;
    return ans;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        memset(dp, -1, 50001 * 101 * sizeof(ll));
        int n, sum;
        cin >> n >> sum;
        ll ans = 0;
        for (int i = 0; i < 10; i++)
        {
            if (sum - i >= 0)
            {
                ans += (countRec(n - 1, sum - i)) % mod;
            }
        }
        cout << ans << endl;
    }
}

bác nào xem giúp em code bị sai ở đâu vậy em check với nghĩ test rồi mà sub toàn sai
hkNtitg.png


1679398878804.png
 
Code:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[101][50001];
const int mod = 1e9 + 7;
ll countRec(int n, int sum)
{
    if (!sum)
        return 0;
    if (n == 1)
        return 1;
    if (dp[n][sum] != -1)
        return dp[n][sum];
    ll ans = 0;
    for (int i = 0; i < 10; i++)
    {
        if (sum - i >= 0)
        {
            ans += (countRec(n - 1, sum - i)) % mod;
        }
    }
    dp[n][sum] = ans;
    return ans;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        memset(dp, -1, 50001 * 101 * sizeof(ll));
        int n, sum;
        cin >> n >> sum;
        ll ans = 0;
        for (int i = 0; i < 10; i++)
        {
            if (sum - i >= 0)
            {
                ans += (countRec(n - 1, sum - i)) % mod;
            }
        }
        cout << ans << endl;
    }
}

bác nào xem giúp em code bị sai ở đâu vậy em check với nghĩ test rồi mà sub toàn sai
hkNtitg.png


View attachment 1731181
theo mình bài này BF là chuẩn nhất
ykkp4yv.png

JavaScript:
function countIntegers(N: number, K: number): number {
  let count = 0, modulo = Math.pow(10,9) + 7;
  for (let i = Math.pow(10, N - 1); i < Math.pow(10, N); i++) {
    let sum = 0, num = i;
    while (num > 0) {
      sum += num % 10;
      num = Math.floor(num / 10);
    }
    if (sum === K) {
      count = (count + 1) % modulo;
    }
  }
  return count;
}
 
theo mình bài này BF là chuẩn nhất
ykkp4yv.png

JavaScript:
function countIntegers(N: number, K: number): number {
  let count = 0, modulo = Math.pow(10,9) + 7;
  for (let i = Math.pow(10, N - 1); i < Math.pow(10, N); i++) {
    let sum = 0, num = i;
    while (num > 0) {
      sum += num % 10;
      num = Math.floor(num / 10);
    }
    if (sum === K) {
      count = (count + 1) % modulo;
    }
  }
  return count;
}
BF là thuật toán gì vậy bạn
 
JavaScript:
/**
 * @param {number[]} nums
 * @return {number}
 */
var zeroFilledSubarray = function(nums) {
    let c = 0, ans = 0;
    for (const n of nums) {
        if (!n) {
            ans += ++c;
        } else {
            c = 0;
        }
    }

    return ans;
};

JavaScript:
var zeroFilledSubarray = nums => nums.reduce(([a, c], it) => [a+(it?c=0:++c), c], [0, 0])[0];
 
Không tối ưu lắm nhưng được cái dễ viết
Time: O(n + e + eloge)
Space: O(n + e)

Python:
class Solution:
    def minScore(self, n: int, roads: List[List[int]]) -> int:
        self.adj = defaultdict(list)
        self.n = n
        
        roads.sort(key=lambda x: x[2])
        
        for a, b, dist in roads:
            self.adj[a].append(b)
            self.adj[b].append(a)
        
        self.visited = set()
        self.found1 = False
        self.foundN = False
        for a, _, dist in roads:
            self.dfs(a)
            if self.found1 or self.foundN:
                return dist
            
    def dfs(self, node):
        if node == 1:
            self.found1 = True
        elif node == self.n:
            self.foundN = True
        
        if node in self.visited:
            return
        
        self.visited.add(node)
        
        for neigh in self.adj[node]:
            self.dfs(neigh)
 
Cùng một thuật toán Go lại chạy nhanh hơn và dùng ít bộ nhớ hơn C :) Đó giờ mình cứ nghĩ C nhanh nhất rồi.

Phân tích độ phức tạp giải thuật mới quan trọng, còn so sánh mấy cái %ms ko chính xác lắm đâu, nhất là những ngôn ngữ có GC thì nó sẽ càng khó có predictable runtime performance.

các bác cho em hỏi bài "162. Find Peak Element"

em không hiểu đoạn neighboor nó là gì mà em làm theo cách tìm index của số lớn nhất trong mảng. Chả hiểu sao lại passed các bác ạ :(

Các bác có đáp án với giải thích cho bài này không giúp em với. Em cảm ơn các bác

Bạn tìm max của array thì tất nhiên nó sẽ đúng, nhưng ko tối ưu, đọc kỹ mô tả thì cái peak chỉ cần lớn element bên trái và bên phải của nó là được.

Bài đó heavy hint nằm ngay trong mô tả, viết sao cho time O(logn) thì chỉ có cách dùng BS. Việc còn lại là viết thật nhanh và test hết mấy corner cases. Bài này nếu đọc hiểu + viết nhanh thì độ tầm 10-15p.

Python:
class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
        n = len(nums)
        left = 0
        right = n
       
        while left < right:
            mid = left + (right - left) // 2
           
            leftMidVal = -float('inf') if (mid - 1) < 0 else nums[mid-1]
            rightMidVal = -float('inf') if (mid + 1) >= n else nums[mid+1]
            midVal = nums[mid]
           
            if midVal > leftMidVal and midVal > rightMidVal:
                return mid
         
            if midVal > leftMidVal and midVal < rightMidVal:
                left = mid + 1
            else:
                right = mid - 1
               
        return left
 
TC: O(n+e)
SC: O(n+e)
Với n là tổng số đỉnh, e là tổng số cạnh

JavaScript:
function minScore(n: number, roads: number[][]): number {
    const map: Map<number, number[][]> = new Map();
    for (const road of roads) {
        if (map.has(road[0])) {
            const val = map.get(road[0]);
            val.push([road[1], road[2]])
            map.set(road[0], val)
        } else {
            map.set(road[0], [[road[1], road[2]]])
        }

        if (map.has(road[1])) {
            const val = map.get(road[1]);
            val.push([road[0], road[2]])
            map.set(road[1], val)
        } else {
            map.set(road[1], [[road[0], road[2]]])
        }
    }
    let ans = Number.MAX_SAFE_INTEGER;
    const queue: number[] = [];
    const visited = new Array(n + 1).fill(false);
    queue.push(1);
    visited[1] = true;
    while (queue.length) {
        const item = queue.shift();
        for (const [first, second] of map.get(item)) {
            ans = Math.min(ans, second)
            if (!visited[first]) {
                visited[first] = true;
                queue.push(first)
            }
        }
    }
    return ans;


};
 
Last edited:
Code:
class Solution {
    public class Data {
        int node;
        int dis;
        
        public Data(int node, int dis) {
            this.node = node;
            this.dis = dis;
        }
    }
    
    public int minScore(int n, int[][] roads) {
        Map<Integer, List<Data>> adjList = new HashMap();
        
        for (int[] road : roads) {
            int src = road[0];
            int dest = road[1];
            int dis = road[2];
            
            adjList.putIfAbsent(src, new ArrayList<>());
            adjList.putIfAbsent(dest, new ArrayList<>());
            
            adjList.get(src).add(new Data(dest, dis));
            adjList.get(dest).add(new Data(src, dis));
        }
        
        int min = Integer.MAX_VALUE;
        
        Queue<Integer> queue = new LinkedList<>();
        queue.add(1);
        Set<Integer> visited = new HashSet<>();
        visited.add(1);
        
        while(!queue.isEmpty()){
            Queue<Integer> nextQueue = new LinkedList<>();
            while (!queue.isEmpty()) {
                int cur = queue.poll();
                List<Data> list = adjList.get(cur);
                for (Data data : list) {
                    min = Math.min(min, data.dis);
                    if (!visited.contains(data.node)) nextQueue.add(data.node);
                }
                visited.add(cur);   
            }
            
            queue = nextQueue;
        }
        
        return min;
    }
}
 
JavaScript:
/**
 * @param {number} n
 * @param {number[][]} roads
 * @return {number}
 */
var minScore = function(n, roads) {
    let ans = +Infinity;
    const nb = [], visited = {};
    roads.forEach(([u, v, d]) => {
        nb[u] ??= [];
        nb[u].push([v, d]);
        nb[v] ??= [];
        nb[v].push([u, d]);
    });
    const q = new Queue();
    q.enqueue(1);
    visited[1] = true;

    while (!q.isEmpty()) {
        const current = q.dequeue();
        for (const [next, dist] of nb[current]) {
            ans = Math.min(ans, dist);
            if (!visited[next]) {
                q.enqueue(next);
                visited[next] = true;
            }
        }
    }

    return ans;
};
 
Back
Top