写在前面

昨天做了一道LeetCode题(747. 至少是其他数字两倍的最大数 - 力扣(LeetCode) (leetcode-cn.com)), 大致意思是找出数组中的最大值和次大值并返回最大值索引, 如果最大值不小于次大值的2倍, 我因为习惯使用Python, 直接调用库函数就出来了(排序, 判断), 但是这样会花费很长时间, 正好看题解有提到一次遍历的方法, 就在这里总结一下, 用C++重写一遍, 也算巩固巩固C++语法了.

代码与解读

#include <iostream>
#include <vector>using namespace std;int test1(vector<int> v)
{// 这里设m1为最大值, m2为次大值, idx为最大值对应的数组下标// 由于题目中nums中元素为自然数, 所以只需取-1即可int m1 = -1, m2 = -1, idx = 0;// 对数组中元素进行遍历for (int i = 0; i < v.size(); ++i){// 如果当前数组元素大于m1, 执行交换if (v[i] > m1){m2 = m1;m1 = v[i];idx = i;} // 如果当前数组元素在m1和m2之间, 记录m2的值else if (v[i] > m2) {m2 = v[i];}}return m1>=m2*2?idx:-1;
}int main(int argc, char const *argv[])
{vector<int> v = {3,2,1,6,7};// vector<int> v = {3,2,1,7};cout<<test1(v)<<endl;return 0;
}

简单推广与总结

我们知道, 寻找最大值的方法是一次遍历, 那么寻找最大值和次大值呢?当然也可以, 上面的题目已经给出了解答, 就是通过交换元素的值来实现的, 那么这个方法是不是可以推广到更多的情况呢?

当然也可以, 下面我们来看如果想寻找数组中的最大值, 次大值和次次大值呢? 将上面的题目稍微更改: 如果最大值大于等于次大值和次次大值的和, 返回最大值的下标, 否则返回-1.

int test2(vector<int> &v)
{int m1 = -1, m2 = -1, m3 = -1, idx = 0;for (int i = 0; i < v.size(); ++i){if (v[i] > m1){m3 = m2;m2 = m1;m1 = v[i];idx = i;} else if (v[i] > m2) {m3 = m2;m2 = v[i];} else if (v[i] > m3) {m3 = v[i];}}cout<<m1<<m2<<m3;return m1>=m2+m3?idx:-1;
}

同样的, 如果想要计算最小值和次小值, 也可以通过动态改变值的方式一次遍历即可得到(注意这里就得取m1为INT_MAX了). 代码如下

int test3(vector<int> &v)
{int m1 = INT_MAX, m2 = INT_MAX, idx = 0;for (int i = 0; i < v.size(); ++i){if (v[i] < m1){m2 = m1;    m1 = v[i];idx = i;} else if (v[i] < m2) {m2 = v[i];} }cout<<m1<<m2;return m1<=m2*2?idx:-1;
}

其实只需改变一下符号即可.

我的理解是这种方法有点像链表中用到的双指针, 不断遍历然后修改值, 就能达到想要的结果.

找出数组中最大值次大值的一次遍历方法(C++)相关推荐

  1. 找出数组中第k大的数

    给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...

  2. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

  3. 2018腾讯内部转岗面试题3——找出数组中比左边大比右边的小的元素

    题目: 以时间复杂度 O(n) 从长度为 n 的数组中找出同时满足下面两个条件的所有元素: (1)该元素比放在它前面的所有元素都大: (2)该元素比放在它后面的所有元素都小. 分析: 面试官给的上面冗 ...

  4. (java)leetcode852 山脉数组的封顶索引(二分查找法找出数组中最大值的下标)(Peak Index in a Mountain Array)

    题目描述: 我们把符合下列属性的数组 A 称作山脉: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... ...

  5. 找出数组中不重复的值php_PHP找出数组中不重复出现的值

    这里通过php数组函数array_count_values()去实现. 实例:<?php $arr = array('2','4','5','8','4','10','2','10','2'); ...

  6. 找出数组中不重复的值php_PHP查找数值数组中不重复最大和最小的10个数的方法...

    搜索热词 本文实例讲述了PHP查找数值数组中不重复最大和最小的10个数的方法.分享给大家供大家参考.具体如下: 1. PHP代码如下: PHP;"> //随机生成1万个元素的数组 fo ...

  7. 找出数组中第k大和第m大的数字之和

    找出数组中第k大和第m大的数字之和 说明:定义一个函数,接受三个参数getMaxNumber(array,k,m){},找出第k大和第m大的数字之和.重复的数组也需要计算 比如:[1,3,4,5,4, ...

  8. java 算法之找出数组中第二大的数

    1.如果仅考虑实现功能而不考虑效率,可以先通过排序算法将数组排序,然后根据数组下标来访问数组中第二大的数,,最快的排序算法一般为快速排序算法,但是其时间复杂度为(nlogn),根据下标访问需要便利一遍 ...

  9. 1985. 找出数组中的第 K 大整数

    1985. 找出数组中的第 K 大整数 给你一个字符串数组 nums 和一个整数 k .nums 中的每个字符串都表示一个不含前导零的整数. 返回 nums 中表示第 k 大整数的字符串. 注意:重复 ...

最新文章

  1. linux7虚拟机修改主机名,centos 7 更改网卡名,主机名,虚拟机添加网卡
  2. HTTP代理神器Fidder
  3. linux怎样反向查找路径,Linux中find的用法
  4. 20175221曾祥杰 实验四《Android程序设计》
  5. python基本数据类型——str
  6. php写不了php,php写入内存不足怎么办
  7. Intellij IDEA搭建vue-cli项目
  8. 布客·ApacheCN 编程/后端/大数据/人工智能学习资源 2021.7
  9. Redis学习---Redis操作之String
  10. 删除PHP配置文件中的注释行
  11. CryptoJS 加密
  12. Ubunt14.04搭建opengrok环境
  13. 误删docker目录/var/lib/docker/overlay2,导致容器build失败
  14. JavaScript 中的事件类型2(读书笔记思维导图)
  15. 苹果语音输入最新资讯
  16. Transition of CSS3
  17. c语言余弦定理float,余弦相似度公式
  18. MySQL主从复制之realy_log_recovery
  19. DAY SIX -- ospf的不规则区域问题和链路状态通告LSA
  20. 计算机专业就业自我推荐意见,计算机科学与技术专业自荐书

热门文章

  1. Python爬虫 Day 3
  2. Ionic4.x 中自定义公共模块
  3. jquery checkbox 操作
  4. JS调用PHP 和 PHP调用JS的方法举例
  5. 记录平时发现的一些小知识点
  6. 为什么要在网站上主动放置沃通全球可信网站认证标志
  7. 浅析MSIL中间语言——基础篇
  8. Fogengine概述
  9. classes目录绝对路径
  10. php使用hset报错,redis中set和hset的区别和使用场景