①中文题目

在一个给定的数组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. Halcon一日一练:图像分割之阈值分割1

    先了解什么是阈值,度娘告诉我的是:一个领域或一个系统的界限称为阈,其数值称为阈值.在图像中,我们把图像看成一个由像素灰度值组成的数集,那么阈,就是这个图像中,根据目标与背景灰度值的差异,选取的一个合适 ...

  2. Flink Connector 深度解析

    作者介绍:董亭亭,快手大数据架构实时计算引擎团队负责人.目前负责 Flink 引擎在快手内的研发.应用以及周边子系统建设.2013 年毕业于大连理工大学,曾就职于奇虎 360.58 集团.主要研究领域 ...

  3. 用Docker搭建一个支持https的nginx代理服务

    用Docker搭建一个支持https的nginx代理服务 说明:本文所提的服务只是作者平常测试使用,可能含有未知bug或不成熟的解决方案,仅供参考,请不要用于正式环境,当然,使用过程中有任何问题欢迎提 ...

  4. Ubuntu 16.04下配置 Nginx 与 Node.js 以及服务的部署

    第一步:安装nginx sudo apt-get update sudo apt-get install nginx 如果遇到依赖问题,尝试执行sudo apt-get -f install命令 第二 ...

  5. python中根据时间获取周数,通过周数获取时间

    # 时间## 时间和周数 import time import datetime # 获取今天是第几周 print(time.strftime('%W')) # 获取当前是周几(0-6,0代表周一) ...

  6. OptimalSolution(4)--字符串问题(2)进阶

    一.将整数字符串转成整数值 二.判断字符数组中是否所有的字符都只出现过一次 三.在有序但含有空的数组中查找字符串 四.数组中两个字符串的最小距离 五.添加最少字符使字符串整体都是回文字符串 六.括号字 ...

  7. MySQL基础篇(2)数据类型

    MySQL提供了多种数据类型,主要包括数值型.字符串类型.日期和时间类型. 1.数值类型 整数类型:TINYINT(1字节).SMALLINT(2字节).MEDIUMINT(3字节).INT(INTE ...

  8. 阿里规范不建议多表Join,可这SQL要怎么写?

    阿里开发手册的描述,禁止多表join: 手册上写着[强制],相信很多同学项目里面的代码都不满足这个要求. 但是关键问题是:不用join,这SQL究竟要怎么写?! 分解关联查询 即对每个要关联的表进行单 ...

  9. web.xml 配置文件 超详细说明!!!

    一.web.xml是什么? 首先 web.xml 是java web 项目的一个重要的配置文件,但是web.xml文件并不是Java web工程必须的. web.xml文件是用来配置:欢迎页.serv ...

  10. 【IntelliJ IDEA】Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA 解决办法

    笔者打开IntelliJ IDEA敲代码的时候遇到了如下问题: IDEA Event Log窗口提示 Unable to save settings: Failed to save settings. ...