- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定任意自然数数组,例如:[2, 1, 2, 3]查找数组是否可以转换为 Max 数组(打印 - "is")或如果不能(打印 - “否”)
使其成为最大数组 - 将数组的每个元素转换为等于其最大元素。在上面,例如它将是 [3, 3, 3, 3] 但遵循这些规则 -
示例输入:[2, 1, 2, 3]
预期输出:"is"
解释:
第 1 步:将第一个和第二个元素递增 1 -
[3, 2, 2, 3]
第 2 步:将第二个和第三个元素递增 1 -
[3, 3, 3, 3]
谁能指出解决方案 - 任何链接、类似问题、模式或解决方案?谢谢
编辑:
我试过这种方法来解决它-
但不能完全得到正确的结果。
最佳答案
这其实是一个已知的采访/programming contest问题,但它通常呈现为“给定一个正整数数组,你能否一次将它们全部减少为零、两个(或 k)?”
有一个简单的解决方案:我们只需要检查是否可以分两步达到所需的和(即检查奇偶校验),以及在所有其他数字都达到最大值时最小的数字是否可以达到最大值.
def is_possible(nums: List[int]) -> bool:
smallest, largest = min(nums), max(nums)
total_needed = sum(largest - x for x in nums)
if total_needed % 2 == 1:
return False
return 2 * (largest - smallest) <= total_needed
这给出:
assert is_possible([6, 6, 10]) == True
assert is_possible([2, 1, 2, 3]) == True
assert is_possible([1, 5, 5, 9]) == True
assert is_possible([1, 2, 9]) == False
assert is_possible([1, 4, 9, 10]) == False
assert is_possible([1, 6, 6, 9]) == False
更具体的问题陈述
此问题的一个不幸特征是,尽管解决方案直观简单,但该解决方案的完整证明相当长。该问题的原始陈述引起了对短语“最大数组”含义的混淆,因此我将尝试对该问题给出精确的数学描述,然后对其进行转换。然后,这将解释为什么代码正在为问题实现自然的“贪婪策略”,以及为什么它有效。
Original Problem: Given a zero-indexed array of positive integers A of length n > 1, you are allowed to perform the following operation any number of times: Choose two distinct indices
i, j with 0 <= i < j < n
, such thatA[i] < max(A) and A[j] < max(A)
, and incrementA[i] and A[j]
. Determine whether you can make all of the array elements equal.
贪心策略
这个问题的“贪婪”或蛮力解决方案,如果性能不是问题,将是从 A 中选择两个最小的元素并递增它们,重复此操作直到 A 中的所有元素或除了一个元素之外的所有元素等于 max(A)。如果恰好有一个元素不等于 max(A),则我们失败了,任务无法完成(此声明需要证明);否则显然是可能的。
def is_possible_brute_force(nums: List[int]) -> bool:
largest = max(nums)
nums.sort()
while nums[0] != largest:
first = nums.pop(0)
second = nums.pop(0)
if second == largest and first != largest: # If exactly one number not max
return False
bisect.insort(nums, first+1)
bisect.insort(nums, second+1)
return all(x == largest for x in nums) # Always true
我们的目标是模拟此过程的结果,而不是实际执行。如果 A 的元素与 max(A) 之间的间隙之和为 total_needed
,我们可以立即观察到该任务是不可能的。 , 很奇怪。我们也可以在不改变答案的情况下对问题应用以下转换:
New Problem: Let M = max(A). Let B be A after the transform A[i] -> M - A[i]. Our allowed operation is now to decrement two distinct indices of B, and our goal is to reach the zero array.
从 B 和递减的角度来思考更容易。你可能想到的第一个策略是:重复递减 B 中最大的两个元素,即贪心策略。事实证明,该策略是最优的,只要存在就找到解决方案。
让Max_B = max(B)
让Sum_B = sum(B)
.由于我们知道如果 Sum_B 为奇数则不存在解,因此我们可以假设 Sum_B 从这里是偶数。有两种可能:
Max_B > Sum_B - Max_B
.在这种情况下,无论我们做什么,在执行 Sum_B - Max_B 自减后,除 Max_B 之外的所有元素都为零,因此无解。Max_B <= Sum_B - Max_B
.在这种情况下,解决方案总是可行的。要证明(2),只需证明两件事:我。如果Max_B <= Sum_B - Max_B
, 然后在递减两个最大的元素后,我们仍然有 Max_B <= Sum_B - Max_B
对于我们的新阵列。二.唯一不可能移动但 B 不为零的配置是当 B 的一个元素不为零时;在这种情况下,Max_B > Sum_B - Max_B
第一个陈述的证明是相当不足为奇的代数运算和案例分析,所以我将从这个已经很长的证明中省略它。第一个 Python 代码片段现在可以理解为检查 total_needed
的奇偶校验。 , 以及我们是否处于上述情况 (1) 或 (2)。
编辑:与解释和证明中的等式相比,原始发布版本的代码在最后一行有错误,使用了不正确的变量名和翻转的不等号。感谢用户 Breaking Not So Bad 捕获了这一点。
关于arrays - 一次递增两个数组元素,使它们都等于最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69232452/
在 C 中: int a[10]; printf("%p\n", a); printf("%p\n", &a[0]); 产量: 0x7fff5606c600 0x7fff5606c600 这是我所期望
我一直在尝试运行此循环来更改基于数组的元素的位置,但出现以下错误。不太确定哪里出了问题。任何想法或想法!谢谢。 var population = [[98, 8, 45, 34, 56], [9, 1
我正在尝试获取一个 Ruby 数组数组并将其分组以计算其值。 数组有一个月份和一个 bool 值: array = [["June", false], ["June", false], ["June"
所以我们的目标是在遇到某个元素时将数组分割成子数组下面的示例 array.split("stop here") ["haii", "keep", "these in the same array bu
在this问题已经回答了两个表达式是相等的,但在这种情况下它们会产生不同的结果。对于给定的 int[] 分数,为什么会这样: Arrays.stream(scores) .forEac
我认为我需要的是哈希数组的数组,但我不知道如何制作它。 Perl 能做到吗? 如果是这样,代码会是什么样子? 最佳答案 perldoc perldsc是了解 Perl 数据结构的好文档。 关于arra
我遇到了这个问题,从 API 中我得到一个扩展 JSON,其中包含一个名为坐标的对象,该对象是一个包含数组 o 数组的数组。 为了更清楚地看这个例子: "coordinates": [
postgres 中有(v 9.5,如果重要的话): create table json_test( id varchar NOT NULL, data jsonb NOT NULL, PRIM
我用 echo "${array[@]}" 和 echo "${array[*]}" 得到了相同的结果。 如果我这样做: mkdir 假音乐; touch fakemusic/{Beatles,Sto
我正在尝试创建 typealias 对象的数组数组 - 但我收到“表达式类型不明确,没有更多上下文”编译错误。这是我的代码: typealias TestClosure = ((message: St
如果您在 Python 中创建一维数组,使用 NumPy 包有什么好处吗? 最佳答案 这完全取决于您打算如何处理数组。如果您所做的只是创建简单数据类型的数组并进行 I/O,array模块就可以了。 另
当我将数组推送到只有一个数组作为其唯一元素的数组数组时,为什么会得到这种数据结构? use v6; my @d = ( [ 1 .. 3 ] ); @d.push( [ 4 .. 6 ] ); @d.
在 Julia 中,我想将定义为二维数组向量的数据转换为二维矩阵数组。 如下例所述,我想把数据s转换成数据t,但是至今没有成功。 我该如何处理这个案子? julia> s = [[1 2 3], [4
C 没有elementsof 关键字来获取数组的元素数。所以这通常由计算 sizeof(Array)/sizeof(Array[0]) 代替但这需要重复数组变量名。1[&Array] 是指向数组后第一
所以,假设我有一个像这样的(愚蠢的)函数: function doSomething(input: number|string): boolean { if (input === 42 || in
我有以下数组: a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] 我将它用于一些像这样的视觉内容: 1 2 3 4 5 6 7 8 9 10
我想知道数组中的 .toList 与 .to[List] 之间有什么区别。我在spark-shell中做了这个测试,结果没有区别,但我不知道用什么更好。任何意见? scala> val l = Arr
我很难获得完全相同对象的多个元素的当前元素索引: $b = "A","D","B","D","C","E","D","F" $b | ? { $_ -contains "D" } 替代版本: $b =
我正在尝试使用来自我的 API 的 v-select 执行 options,我将数据放在数组数组中。 Array which I got from API 它应该是一个带有搜索的 select,因为它
这个问题在这里已经有了答案: String literals: pointer vs. char array (1 个回答) 4 个月前关闭。 当我执行下一个代码时 int main() {
我是一名优秀的程序员,十分优秀!