LC 3012. 通过操作使数组长度最小
https://leetcode.cn/problems/minimize-length-of-array-using-operations/description/
纯粹是一个数学思维的题目,分为几个点来解决:
- 首先是考虑最小元素,因为最小元素可以不断地和更大的元素组合而保留自己。
- 但是只是上面这一个思路不行,比如 case `[5, 2, 2, 2, 9, 10]`, 如果只关注2的话,会忽略 10%9=1, 可以产生更小的元素。
- 除此之外,还需要看其他元素是否可以模这个最小元素,产生更小的元素:如果可以产生更小元素的话,那么结果就是1.
- 如果最后没有办法的话,那么就是自己和自己进行组合,结果是 `ceil(x/2)`.
这里有个点我没有相同,就是是否这个最小元素可能来自于其他组合比如(x, y), 而不是来自于(x', y). 其中x'是目前看到的最小元素呢?
这个是可能的,但是似乎没有关系,因为只要可以产生比x'更小的元素,那么最短长度就是1. 如果所有的元素都满足 x % x' = 0 的话,组合出来的值肯定是大于等于x'的。
class Solution: def minimumArrayLength(self, nums: List[int]) -> int: M = min(nums) cnt = 0 for x in nums: if x == M: cnt += 1 if x % M != 0: return 1 return (cnt + 1) // 2