题目连结:747. Largest Number At Least Twice of Others
题目主题:Array、Sorting
选择这题的主要原因是它让我想到了基本排序之一 Selection Sort 排序法,所以这次来分享一下 Selection Sort 的排序是怎麽运作的。
Selection Sort是一种基本的排序阵列方法,用双回圈的方式来处理排序。以小到大的排序为例,Selection Sort的每一圈都会确认一个数字的位置,每一圈选择目前未确认范围的最小数字与这个范围的最前面的数字调换位置,处理过程如下图。
范例:nums = [32, 2, 18, 45, 15]
大红方框是未确认范围,每一圈会找到这个范围的最小数字(上图中的红色数字),这个数字会与大红方框中最前面的数字调换位置,跑完後就可以完成nums从小到大的排序。
建议可以看看LeetCode原本的题目说明,这边是用我的方式说明题目,参考就好。
本题的目标是在一个nums的所有数字中,找到最大数字并且nums中其他数字的两倍不能大於这个数字,最终输出这个数字的位置(Index)。若找不到符合这条件的数字就回传-1。
约束:
范例1
输入:nums = [3,6,1,0]
输出:1
解释:6是这个阵列中最大的数字,其他数字两倍也没大於6,因此输出为1这个位置。
范例2
输入:nums = [1,2,3,4]
输出:-1
解释:最大的数字是4,但其中3的两倍是6已经大於4了,因此回传-1。
范例3
输入:nums = [1]
输出:0
解释:若只有一个数字,可直接回传0,因为没有其他数字,所以也符合其他数字两倍不能大於最大数这个条件。
建议到这边先停下来,尝试自己解解看,若没有想法可再继续走下去。
范例:nums = [3, 6, 1, 0]
上图中,第一回圈找到了 6 这个最大的数字,并记录了他的位置 1 。第二回圈,因为记录到最大数字的位置是 1 ,所以略过 1 的位置,而其他位置数字乘2後都没有大於最大的数字 6 ,因此最後直接回传 1 。
若因为没想法而走到这边,建议看完想像以後再给自己一次机会试一次。
class Solution:
def dominantIndex(self, nums: List[int]) -> int:
# 纪录最大数字的位置
resultIndex = 0
# 第一回圈找出最大数字位置
for i in range(1, len(nums)):
if nums[resultIndex] < nums[i]:
resultIndex = i
# 第二回圈检查有没有乘2大於最大数的数字
for i in range(len(nums)):
if resultIndex == i: continue
if nums[resultIndex] < nums[i]*2:
resultIndex = -1
break
return resultIndex
若内容有什麽问题或建议欢迎一起交流:)
感谢您今天愿意花时间看完这篇文章~~~~
Next:88. Merge Sorted Array
忘记在哪边看到的一句话 最难的工作要交给最懒的人,因为他会找到最有效率、省时省工的方式把它完成 由...
关於SEC的事情 资料库演练100%备份还原 每年至少两次的资料灾害恢复演练,资料要100%覆盖,要...
大家好! 自从系列开始到昨天,也已经流逝 45 天的时间了。 这期间,总是会怀疑自己写的文章够不够好...
柒、第六章 风险管理 这个章节是ISO标准设置来取代以前「预防措施」的概念,在条文中首先强调的是风险...
前言 昨天讲到为什麽要使用self-attention,今天稍微来介绍一下self-attentio...