[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的最后一个元素相等,若相等,则输出当前索引下标。
③正确的代码
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 (至少是其他数字两倍的最大数)的更多相关文章
- [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 ...
- Leetcode747.Largest Number At Least Twice of Others至少是其他数字两倍的最大数
在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 1: 输入: nums = [3, ...
- LeetCode:至少是其他数字两倍的最大数【747】
LeetCode:至少是其他数字两倍的最大数[747] 题目描述 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素 ...
- Java实现 LeetCode 747 至少是其他数字两倍的最大数(暴力)
747. 至少是其他数字两倍的最大数 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素的索引,否则返回-1. 示例 ...
- [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 ...
- C#LeetCode刷题之#747-至少是其他数字两倍的最大数( Largest Number At Least Twice of Others)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3746 访问. 在一个给定的数组nums中,总是存在一个最大元素 ...
- LeetCode算法题-Largest Number At Least Twice of Others(Java实现)
这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...
- 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 ...
- 【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 ...
随机推荐
- pdfminer API介绍:pdf网页爬虫
安装 pip install pdfminer 爬取数据是数据分析项目的第一个阶段,有的加密成pdf格式的文件,下载后需要解析,使用pdfminer工具. 先介绍一下什么是pdfminer 下面是官方 ...
- iOS开发请您把握现在 — 面向未来学习
iOS开发请您把握现在 — 面向未来学习 这一篇文章,如果你是一名iOS开发正好也处于开发晋升瓶颈迷茫期,不妨停下你的脚步,花五分钟看看,兴许有你需要的!文章结尾有彩蛋 群里常见的唱哀 iOS现在到底 ...
- 实用---eclipse中的代码提示功能
Eclipse 的代码提示功能,具体配置 1. 打开Eclipse ,然后“window”→“Preferences” 2. 选择“java”,展开,“Editor”,选择“Content Assis ...
- css涂鸦这样玩
前言 上一次深扒CSS的时候,还说CSS和H5绘制复杂图形很麻烦,看了大神的操作后,感觉茅塞顿开了,哈哈. 就算可能我暂时没有用到的机会,学习一下开发者的设计思路也是受益匪浅呀. 嗯,今天要介绍的是一 ...
- ESP8266开发之旅 网络篇⑩ UDP服务
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 详解JavaScript调用栈、尾递归和手动优化
调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...
- java的数制转换(详解,全!)
对于进制转换,c/c++要用到辗转相除,不仅浪费时间,还造成代码量繁多,而任意之间的进制转换还需要以十进制为跳板, 先将其他进制的数字转换为十进制,再将十进制转换为其他进制,而java中自带进制转换的 ...
- Vue系列---源码调试(二)
我们要对Vue源码进行分析,首先我们需要能够对vue源码进行调式(这里的源码调式是ES6版本的,不是打包后的代码),因此首先我们要去官方github上克隆一份vue项目下来,如下具体操作: 1. cl ...
- Easy Poi入门
最近有一个需求,就是把excel中的内容,解析成Json对象格式的文件输出. 然后就上网找了一波资料,大神们都说用POI来做.但是我看了一下POI的解析过程,但是为了秉着高效的原则,花最少的时间去实现 ...
- The usage of Markdown---文字强调:加粗/斜体/文本高亮/删除线/下划线/按键效果
更新时间:2019.09.14 1. 序言 有时候,我们需要对某些文字进行强调,例如粗体和斜体.而Markdown通常可以使用星号*或者下划线_进行文字强调. 2. 加粗 如果想要达到加粗的效果,可以 ...