前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法创作|至少是其他数字两倍的最大数

算法创作|至少是其他数字两倍的最大数

作者头像
算法与编程之美
发布2021-03-30 14:49:46
3700
发布2021-03-30 14:49:46
举报

一道脑筋急转弯

问题描述

在一个给定的数组nums中,总是存在一个最大元素 。查找数组中的最大元素是否至少是数组中每个其他数字的两倍。如果是,则返回最大元素的索引,否则返回 -1

来源:力扣(LeetCode)

示例:

输入: nums = [3,6,1,0]

输出: 1

解释: 6是最大的整数,对于数组中其他整数,6大于其他元素的两倍。6的索引是1,所以我们返回1。

解决方案

如果要解决这个问题,我们先要读懂题目要求,首先题目说查找数组中的最大元素是否至少是数组中每个其他数字的两倍。重点注意这个其他,这说明我们找的元素只能和数组中除了最大整数以外的其他整数比较,如果我们的最大整数需要比其余所有元素的两倍大,那只需要找到数组中第二大的元素来进行比较就可以了。现在就有两种思路,第一种就是用排序方法来找出第二大的元素,这种方法需要注意比较的时候转化为整数的形式。

首先我们用max函数找出数组中最大的整数,便于之后的比较。然后就是一个难点了,如果数组的长度小于2,那我们在取第二大元素的时候会报错,因为一共只有一个元素,所以先要进行一次数组长度判断,如果只有一个元素在里边,那么返回的就必然是0,如果不是这种特殊情况,再正常将最大整数和第二大整数进行比较。最后使用index()来获取下标。

第一种方法代码如下:

代码语言:javascript
复制

class Solution:

     def dominantIndex(self, nums: List[int]) -> int:

         num1 = max(nums)#数组中最大的那个整数

         if len(nums)<2:

            return 0

         else:

            if num1 >= (2 *  int(sorted(nums)[-2])):

                return nums.index(num1)

            else:

            return -1

第二种方法就是将nums中的最大整数移除,再使用max()函数取出第二大元素进行比较,这种方法需要注意的是,移除后的数组不可以再进行取下标的操作,需要重新建立完整的列表。其余步骤和第一种相同。

代码语言:javascript
复制
class Solution:

     def dominantIndex(self, nums: List[int]) -> int:

         num1 = max(nums)

         l = []

         for i in nums:

            l.append(i)

         if len(nums)<2:

            return 0

         else:

            nums.remove(num1)

            num2 = max(nums)

            if num1 >= (2 * int(num2)):

                return l.index(num1)#要使用未进行删除过的列表

            else:

                return -1

结语

本题的难点是读懂题目要求,一般这些题都有很多很特殊的测试用例,所以一定要读懂题目要求,再进行严谨的编写。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档