①中文题目

在一个给定的数组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的最后一个元素相等,若相等,则输出当前索引下标。

③正确的代码

 class Solution {
public int dominantIndex(int[] nums) {
int[] arr=new int[nums.length];
for(int i=0;i<nums.length;i++)
arr[i]=nums[i];
Arrays.sort(arr);
int result=0;
if(nums.length==1)
result=0;
if(nums.length>=2){
if(arr[nums.length-1]>=(2*arr[nums.length-2])){
for(int i=0;i<nums.length;i++){
if(nums[i]==arr[nums.length-1]){
return i;
}
}
}
else
result=-1;
}
return result;
}
}

④错误的代码,也就是卡了我很久的代码

 class Solution {
public int dominantIndex(int[] nums) {
int[] arr=nums;
Arrays.sort(arr);
int result=0;
if(nums.length==1)
result=0;
if(nums.length>=2){
if(arr[nums.length-1]>=(2*arr[nums.length-2])){
for1:
for(int i=0;i<nums.length;i++){
if(nums[i]==arr[nums.length-1]){
// result=i;
//break for1;
return i;
}
}
}
else
result=-1;
}
return result;
}
}

可以看到,在实现思路中提到的“将原数组复制为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%的人,继续努力!

⑤别人的代码(有料)(也即有知识可以学到)

    

 if(nums.length < 1 || nums.length >= 50){
return -1;
}
if(nums.length == 1){
return 0;
}
int maxNum = Integer.MIN_VALUE;
int secondNum = Integer.MIN_VALUE;
int index = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] > maxNum){
secondNum = maxNum;
maxNum = nums[i];
index = i;
}else{
if(secondNum < nums[i]){
secondNum = nums[i];
}
}
}
if(maxNum >= secondNum*2)
return index;
return -1;

从中学到的东西:

1、把变量初始化为最大常量(全局变量),最小常量(全局变量)

Integer.MAX_VALUE  和  Integer.MIN_VALUE

2、这样寻找最大值和第二大的值

 if(nums[i] > maxNum){     //新来的,比原先最大的还大

        secondNum = maxNum;

        maxNum = nums[i];
}
else{
if(secondNum < nums[i]){ //新来的只比原先第二大的大
secondNum = nums[i];
}
}

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 (至少是其他数字两倍的最大数)的更多相关文章

  1. [LeetCode] Largest Number At Least Twice of Others 至少是其他数字两倍的最大数

    In a given integer array nums, there is always exactly one largest element. Find whether the largest ...

  2. Leetcode747.Largest Number At Least Twice of Others至少是其他数字两倍的最大数

    在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums = [3, ...

  3. LeetCode:至少是其他数字两倍的最大数【747】

    LeetCode:至少是其他数字两倍的最大数[747] 题目描述 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素 ...

  4. Java实现 LeetCode 747 至少是其他数字两倍的最大数(暴力)

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

  5. [Swift]LeetCode747. 至少是其他数字两倍的最大数 | Largest Number At Least Twice of Others

    In a given integer array nums, there is always exactly one largest element. Find whether the largest ...

  6. C#LeetCode刷题之#747-至少是其他数字两倍的最大数( Largest Number At Least Twice of Others)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3746 访问. 在一个给定的数组nums中,总是存在一个最大元素 ...

  7. LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

    这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...

  8. 747. Largest Number At Least Twice of Others比所有数字都大两倍的最大数

    [抄题]: In a given integer array nums, there is always exactly one largest element. Find whether the l ...

  9. 【Leetcode_easy】747. Largest Number At Least Twice of Others

    problem 747. Largest Number At Least Twice of Others 题意: solution1: class Solution { public: int dom ...

随机推荐

  1. Oracle基于延时的盲注总结

    0x00 前言 oracle注入中可以通过页面响应的状态,这里指的是响应时间,通过这种方式判断SQL是否被执行的方式,便是时间盲注: oracle的时间盲注通常使用DBMS_PIPE.RECEIVE_ ...

  2. [NOIp2014] luogu P2312 解方程

    题目描述 已知方程∑i=0naixi=0\sum_{i=0}^{n}{a_ix^i}=0i=0∑n​ai​xi=0求该方程在 [1,m][1,m][1,m] 内的整数解. Solution 有一个秦九 ...

  3. Vulnhub靶场渗透练习(三) bulldog

    拿到靶场后先对ip进行扫描 获取ip  和端口 针对项目路径爆破 获取两个有用文件 http://192.168.18.144/dev/ dev,admin 更具dev 发现他们用到框架和语言 找到一 ...

  4. python学习-函数和lambda表达式(五)

    5.2函数参数 位置参数:根据位置传入参数 关键字参数:根据参数名来传入参数 def girth(width, height): print("width:", width) pr ...

  5. Uipath创建文件夹

    东京IT青年前线 http://www.rpatokyo.com/ Uipath创建文件夹 使用Create Folder进行文件夹的创建 这里可以指定相对路径和绝对路径 如果没有指定文件夹的绝对路径 ...

  6. lable的渲染

    <StackPanel Margin=" TextOptions.TextFormattingMode="Display"> <Label TextOp ...

  7. 【网络安全】Dos攻击科普文

    目录 DOS攻击 什么是DOS攻击 攻击手段分类 具体的攻击方式举例 优秀博客参考 DDOS攻击 DOS攻击 什么是DOS攻击 DOS是Denial of Service的简称,用中文简单翻译就是拒绝 ...

  8. 使用C++代码打印数字正方形

    使用C++代码打印数字正方形 作为一名初学者,最近在跟着网课学习C++程序设计基础.在学习过程中遇到了一些习题,我根据自己的理解和思路写了一些代码实现,算是对自己学习过程的一个记录,也希望可以对别人有 ...

  9. 面对对象高阶+反射+魔法方法+单例(day22)

    目录 昨日内容 组合 封装 property装饰器 多态 鸭子类型 今日内容 classmethod staticmethod 面对对象高级 isinstance issubclass 反射(重要) ...

  10. 数据结构(四十四)交换排序(1.冒泡排序(O(n²))2.快速排序(O(nlogn))))

    一.交换排序的定义 利用交换数据元素的位置进行排序的方法称为交换排序.常用的交换排序方法有冒泡排序和快速排序算法.快速排序算法是一种分区交换排序算法. 二.冒泡排序 1.冒泡排序的定义 冒泡排序(Bu ...