[LC]747题 Largest Number At Least Twice of Others (至少是其他数字两倍的最大数)
Posted zf007
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LC]747题 Largest Number At Least Twice of Others (至少是其他数字两倍的最大数)相关的知识,希望对你有一定的参考价值。
①中文题目
在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。
示例 1:
输入: nums = [3, 6, 1, 0]
输出: 1
解释: 6是最大的整数, 对于数组中的其他整数,
6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.
示例 2:
输入: nums = [1, 2, 3, 4]
输出: -1
解释: 4没有超过3的两倍大, 所以我们返回 -1.
提示:
nums 的长度范围在[1, 50].
每个 nums[i] 的整数范围在 [0, 100].
②思路:今天这个题本来很简单的,但是我由于一个小地方的知识点错误,导致调了1个小时才发现问题所在。
整体来说,我做这个题的思路就是,将原数组复制为arr,对arr排升序,然后判断arr的最后一个元素是否大于等于倒数第二个元素的2倍。
如果是,那么开始遍历nums数组,看里面哪个元素跟arr的最后一个元素相等,若相等,则输出当前索引下标。
③正确的代码
1 class Solution 2 public int dominantIndex(int[] nums) 3 int[] arr=new int[nums.length]; 4 for(int i=0;i<nums.length;i++) 5 arr[i]=nums[i]; 6 Arrays.sort(arr); 7 int result=0; 8 if(nums.length==1) 9 result=0; 10 if(nums.length>=2) 11 if(arr[nums.length-1]>=(2*arr[nums.length-2])) 12 for(int i=0;i<nums.length;i++) 13 if(nums[i]==arr[nums.length-1]) 14 return i; 15 16 17 18 else 19 result=-1; 20 21 return result; 22 23
④错误的代码,也就是卡了我很久的代码
1 class Solution 2 public int dominantIndex(int[] nums) 3 int[] arr=nums; 4 Arrays.sort(arr); 5 int result=0; 6 if(nums.length==1) 7 result=0; 8 if(nums.length>=2) 9 if(arr[nums.length-1]>=(2*arr[nums.length-2])) 10 for1: 11 for(int i=0;i<nums.length;i++) 12 if(nums[i]==arr[nums.length-1]) 13 // result=i; 14 //break for1; 15 return i; 16 17 18 19 else 20 result=-1; 21 22 return result; 23 24
可以看到,在实现思路中提到的“将原数组复制为arr”这句话时,我的错误代码里写的是第3行。就是这里错了。
运行错误的代码,得到
Input [1,0]
Output 1
Expected 0.
检查了很久才开始怀疑第3行错了,一番查询之后才知道下面这个例子
int[] array1=new int[]1,2,3,4,5,6;
int[] array2=array1;//将array1的引用,赋值给array2,两数组指向同一个内存空间。
也就是说,我的错误代码里的第3行运行之后,arr跟nums指向同一个内存空间,而我需要让arr与nums是分开的,尽管他们内容在第3行末尾相同。
所以我将地3行改成了循环赋值,达到复制的效果。
最后,beat了25%的人,继续努力!
⑤别人的代码(有料)(也即有知识可以学到)
1 if(nums.length < 1 || nums.length >= 50) 2 return -1; 3 4 if(nums.length == 1) 5 return 0; 6 7 int maxNum = Integer.MIN_VALUE; 8 int secondNum = Integer.MIN_VALUE; 9 int index = 0; 10 for(int i = 0; i < nums.length; i++) 11 if(nums[i] > maxNum) 12 secondNum = maxNum; 13 maxNum = nums[i]; 14 index = i; 15 else 16 if(secondNum < nums[i]) 17 secondNum = nums[i]; 18 19 20 21 if(maxNum >= secondNum*2) 22 return index; 23 return -1;
从中学到的东西:
1、把变量初始化为最大常量(全局变量),最小常量(全局变量)
Integer.MAX_VALUE 和 Integer.MIN_VALUE
2、这样寻找最大值和第二大的值
1 if(nums[i] > maxNum) //新来的,比原先最大的还大 2 3 secondNum = maxNum; 4 5 maxNum = nums[i]; 6 7 else 8 if(secondNum < nums[i]) //新来的只比原先第二大的大 9 secondNum = nums[i]; 10 11
3、这个人的代码的速度为0ms,击败了100%的人,回忆我自己的代码,首先复制一个数组可能没耗时太多,但是给arr排序用了太多时间(尽管Arrays.sort是默认快排),因此,以后的题里的代码里,最好少用排序函数,它太耗时了。
4、关于数组的复制,有4种方法,见https://www.cnblogs.com/Dearmyh/p/10576353.html
以上是关于[LC]747题 Largest Number At Least Twice of Others (至少是其他数字两倍的最大数)的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 747. Largest Number At Least Twice of Others
747_Largest-Number-At-Least-Twice-of-Others
747.Largest Number At Least Twice of Others
747. Largest Number At Least Twice of Others
747. Largest Number At Least Twice of Others
[LeetCode] 747. Largest Number At Least Twice of Others_Easy