Contents

ARST打卡第309周

Algorithm

lc368_最大整除子集

思路:

感觉像素数集合,就是把所有数字取模到同一个素数集合中,最后返回最大的。有1加1。

但是素数集有点大,而且不太合题意,被cursor直接提醒了用dp记录了…cursor应该集成了题库。

这里是每次都 prev 更新路径,也可以直接先找到对应的长度和数字,然后一次遍历 prev 路径。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
impl Solution {
    pub fn largest_divisible_subset(nums: Vec<i32>) -> Vec<i32> {
        let mut nums = nums;
        nums.sort_unstable();
        let n = nums.len();
        
        // dp[i] 表示以 nums[i] 结尾的最大整除子集的大小
        let mut dp = vec![1; n];
        // prev[i] 记录前一个元素的索引,用于重建子集
        let mut prev = vec![-1; n];
        
        let mut max_size = 0;
        let mut max_index = 0;
        
        for i in 0..n {
            for j in 0..i {
                // 如果 nums[i] 能被 nums[j] 整除,则可以将 nums[i] 加入到以 nums[j] 结尾的子集中
                if nums[i] % nums[j] == 0 && dp[j] + 1 > dp[i] {
                    dp[i] = dp[j] + 1;
                    prev[i] = j as i32;
                }
            }
            
            // 更新最大子集的大小和结束索引
            if dp[i] > max_size {
                max_size = dp[i];
                max_index = i;
            }
        }
        
        // 重建最大整除子集
        let mut result = Vec::new();
        let mut i = max_index as i32;
        while i >= 0 {
            result.push(nums[i as usize]);
            i = prev[i as usize];
        }
        
        // 由于我们是从后往前构建的,需要反转结果
        result.reverse();
        result
    }
}

Review

拥抱你的创造力!【TED演讲】

Embrace Your Love, Talk to someone, Do something you want to do.

不要被习惯和世俗束缚,做想做的事,就能释放原本就有的创造力。

经过思考的人生,才是感到治愈,感动和不后悔的人生。

Tip

PPP Vs PvP

Share

Jupiter介绍分享