leetcode硬码,最后两个问题:2809。最少的时间x&2813。
#编程 #算法 #ios #swift

2809。最小的时间进行数组总和:使用动态编程的有效迅速解决方案,以最大程度地减少阵列A和B中的总和B。 em>

2813。 K-Length Subseq的最大优雅:Sergey的Swift代码优雅地选择了具有利润和类别的独特K-Length子序列。解决方案使用分类和迭代。时间:o(nlogn),空间:o(n)。

github:https://github.com/sergeyleschev/leetcode-swift

2809.最少有时间制作数组总和的时间x

描述

LeetCode

方法

我们首先将阵列A和B的总和分别计算为SA和SB。

如果没有采取任何措施,在i秒时,我们将拥有SB * i + sa。

在t秒内,我们选择t元素。当我们考虑这些选定的元素时,将删除[i]。这些选定元素的总和为b1 *(t -1) + b2 *(t -2) + ... + bt * 0,其中b1,b2,b3,...,bt以越来越多的顺序排列。

要解决这个问题,我们根据b [i]的值对所有对(b [i],a [i])进行排序。

然后,我们使用以下逻辑利用动态编程(DP):
DP [J] [i]代表使用J + 1个spemallest整数在I秒内可以降低的最大值。

DP方程如下:
dp [j] [i] = max(dp [j] [i],dp [j -1] [i -1] + i * b + a)

最后,如果sb * i + sa -dp [n -1] [i]小于或等于x,我们返回i秒的值。如果没有,我们返回-1。

只能通过仅存储DP数组的第一维来优化空间复杂性。

复杂

时间复杂性:O(n^2)
空间复杂性:O(n)

代码(Swift)


class Solution {
    func minimumTime(_ nums1: [Int], _ nums2: [Int], _ x: Int) -> Int {
        let n = nums1.count
        var dp = [Int](repeating: 0, count: n + 1)

        let sortedPairs = zip(nums2, nums1).sorted { $0.0 < $1.0 }

        for (j, (b, a)) in sortedPairs.enumerated() {
            for i in stride(from: j + 1, through: 1, by: -1) {
                dp[i] = max(dp[i], dp[i - 1] + i * b + a)
            }
        }

        let sa = nums1.reduce(0, +)
        let sb = nums2.reduce(0, +)

        for i in 0...n {
            if sb * i + sa - dp[i] <= x {
                return i
            }
        }

        return -1
    }
}

来源:Github

2813. K长度子序列的最大优雅

描述

LeetCode

直觉

该方法涉及根据“ Profurei”以降序排序“项目”阵列。通过选择第一个“ K”项目,我们确保我们获得最高的“ total_profit”。

方法

选择初始“ k”项目时,注意将其剩余的“ n -k”项目转向。添加这些项目的可行性取决于它们是否属于未探索的类别(尚未在“可见”集中)。

考虑到维持“ K”的子序列大小的限制,出现了一个关键的决定。为了优化优雅度量,当该物品与另一个类别共享其类别时,该算法从战略上取代了现有项目。

这个迭代的完善过程不断调整子序列,同时维护类别独特性的必要性。

该功能的最终输出封装了通过这种复杂的过程获得的优雅巅峰之作,这是总利润和类别奇点累积影响的结合。

复杂

时间复杂性:O(nlogn)
空间复杂性:O(n)

代码(Swift)


class Solution {
    func findMaximumElegance(_ items: [[Int]], _ k: Int) -> Int {
        var items = items.sorted(by: { $0[0] > $1[0] })
        var res: Int64 = 0
        var cur: Int64 = 0
        var dup = [Int]()
        var seen = Set<Int>()

        for i in 0..<items.count {
            if i < k {
                if seen.contains(items[i][1]) {
                    dup.append(items[i][0])
                }
                cur += Int64(items[i][0])
            } else if !seen.contains(items[i][1]) {
                if dup.isEmpty {
                    break
                }
                cur += Int64(items[i][0] - dup.removeLast())
            }
            seen.insert(items[i][1])
            res = max(res, cur + Int64(seen.count) * Int64(seen.count))
        }

        return Int(res)
    }
}

来源:Github


联系人
我明确专注于上市时间,而没有优先考虑技术债务。我作为系统建筑师,移动(ios-swift,android-kotlin),前端(react-typescript)和后端(nodejs-.net-.net-php-php-php-php-kafka-sql)参加了系统架构师的预售/RFX活动。 -nosql)。我还通过知识转移到成功交付的知识转移,成立了预售作为CTO的工作。

在 ð§电子邮件:sergey.leschev@gmail.com
ðLinkedIn:https://linkedin.com/in/sergeyleschev/
ðleetcode:https://leetcode.com/sergeyleschev/
ðTwitter:https://twitter.com/sergeyleschev
ðgithub:https://github.com/sergeyleschev
ð网站:https://sergeyleschev.github.io
ðreddit:https://reddit.com/user/sergeyleschev
ðQuora:https://quora.com/sergey-leschev
ð媒介:https://medium.com/@sergeyleschev
ð - PDF设计模式:Download