[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

猜你喜欢

转载自www.cnblogs.com/zf007/p/11525271.html
今日推荐