LeetCode 2790(硬)。长度增加的最大组数。一天的解决方案。 o(nlogn)。数学。
#编程 #算法 #ios #swift

描述

您获得了长度为n。

您的任务是使用从0到n -1的数字创建组,以确保在所有组中总共使用的每个数字i不超过usagelimits [i]次。您还必须满足以下条件:

  • 每个组必须由不同的数字组成,这意味着在一个组中不允许重复数字。
  • 每个组(第一个组除外)必须严格的长度大于以前的组。

返回一个整数,表示您可以在满足这些条件时可以创建的最大组数。

示例1:

Input: usageLimits = [1,2,5]
Output: 3
Explanation: In this example, we can use 0 at most once, 1 at most twice, and 2 at most five times.
One way of creating the maximum number of groups while satisfying the conditions is: 
Group 1 contains the number [2].
Group 2 contains the numbers [1,2].
Group 3 contains the numbers [0,1,2]. 
It can be shown that the maximum number of groups is 3. 
So, the output is 3. 

示例2:

Input: usageLimits = [2,1,2]
Output: 2
Explanation: In this example, we can use 0 at most twice, 1 at most once, and 2 at most twice.
One way of creating the maximum number of groups while satisfying the conditions is:
Group 1 contains the number [0].
Group 2 contains the numbers [1,2].
It can be shown that the maximum number of groups is 2.
So, the output is 2.

示例3:

Input: usageLimits = [1,1]
Output: 1
Explanation: In this example, we can use both 0 and 1 at most once.
One way of creating the maximum number of groups while satisfying the conditions is:
Group 1 contains the number [0].
It can be shown that the maximum number of groups is 1.
So, the output is 1.

约束:

1 <= usagelimits.length <= 10^5
1 <= usagelimits [i] <= 10^9

LeetCode TOP 200 Sergey Leschev

方法

  1. Sorting the usageLimits array:第一步是按上升顺序对输入数组进行分类。排序需要o(nlogn)时间复杂性,其中n是usagelimits数组的长度。

  2. Tracking the total and count:总变量用于跟踪排序的usagelimits数组中元素的累积总和。计数变量表示迄今为止创建的组的数量以满足条件。

  3. Iterating through the sorted array:该函数使用用于循环的排序阵列迭代。对于索引I处的每个元素,它将值添加到总计中。总计的目的是跟踪到目前为止形成的所有组的允许发生的总数。

  4. Checking the conditions:在将元素添加到总数之后,该函数检查当前总值是否大于下一组所需的总和。下一组所需的总和是((count + 1) *(count + 2)) /2。在此处,count + 1表示下一个组的长度,(count + 2) / 2表示从0到计数到count + 1的元素总和。

  5. Incrementing the count:如果步骤4中的条件为真,则计数会增加,表明可以形成另一组。

  6. Returning the result:在整个排序的数组中迭代后,计数变量将代表在满足条件时可以创建的最大组数。该功能返回此计数。

LeetCode TOP 200 Sergey Leschev

复杂

时间复杂性:o(n logn)。

该解决方案的time complexity主要由排序步骤(n logn)主导,其中n是输入阵列USAGELIMITS的长度。其余的操作涉及简单的算术和比较,这需要线性时间。因此,该函数的整体时间复杂性为O(nlogn)。

代码(Swift)


class Solution {

    func maxIncreasingGroups(_ usageLimits: [Int]) -> Int {
        var sortedLimits = usageLimits.sorted()
        var total = 0
        var count = 0

        for i in 0..<sortedLimits.count {
            total += sortedLimits[i]
            if total >= ((count + 1) * (count + 2)) / 2 {
                count += 1
            }
        }

        return count
    }
}

来源:Github

LeetCode TOP 200 Sergey Leschev


联系人
我明确专注于上市时间,而没有优先考虑技术债务。我参加了作为系统架构师的预售/RFX活动,用于移动的评估工作(iOS-SWIFT,ANDROID-KOTLIN),FRONTERD(REACT-TYPESCRIPT)和后端(nodejs-.net-php-php-kafka-kafka-sql-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