楼主: 美帝马甲
跳转到指定楼层
上一主题 下一主题
收起左侧

[数组] 返回第二大的元素index

 
🔗
maristie 2021-8-28 15:02:02 | 只看该作者
全局:
本帖最后由 maristie 于 2021-8-28 16:10 编辑
  1. """
  2. Find indices in ascending order whose values are second largest in arr in O(n) time and space.

  3. >>> find_second_largest_elements([6,6,1,6,5,3,5,2,1,3])
  4. [4, 6]
  5. """

  6. from typing import List
  7. from collections import defaultdict

  8. def find_second_largest_elements(arr: List[int]) -> List[int]:
  9.     max2, indices = set(), defaultdict(list)
  10.     for i, e in enumerate(arr):
  11.         indices[e].append(i)
  12.         if not max2 or len(max2) < 2:
  13.             max2.add(e)
  14.         else:
  15.             if e > min(max2):
  16.                 max2.remove(min(max2))
  17.                 max2.add(e)
  18.     return indices[min(max2)]

  19. if __name__ == '__main__':
  20.     import doctest
  21.     doctest.testmod()
复制代码
回复

使用道具 举报

🔗
vvqqdd 2021-8-28 16:06:49 | 只看该作者
全局:
可以 看了大家的方法 我学到很多
回复

使用道具 举报

全局:
美帝马甲 发表于 2021-08-27 09:41:05
因为我没用堆,只用2个变量和2个index处理
如果求第三大,不就需要3个了吗?这里只是k=2的特例吧。
回复

使用道具 举报

🔗
 楼主| 美帝马甲 2021-8-29 00:49:47 | 只看该作者
全局:
资深老鼠人 发表于 2021-8-28 02:43
如果求第三大,不就需要3个了吗?这里只是k=2的特例吧。

yes
2th和3th的一次遍历思路类似
我遇到过面3th的,也是要求一次遍历
回复

使用道具 举报

🔗
 楼主| 美帝马甲 2021-8-29 00:59:34 | 只看该作者
全局:
  1. package ThirdReplace;

  2. public class findSecondMaxIndex {
  3.     int findSecondIndex(int[] nums){

  4.         int largest=Integer.MIN_VALUE,second=Integer.MIN_VALUE;
  5.         int  largestIdx=0,res=0;
  6.         for(int i=0;i<nums.length;i++){
  7.             if(nums[i]>largest){
  8.                 second=largest;
  9.                 res=largestIdx;
  10.                 largest=nums[i];
  11.                 largestIdx=i;
  12.             }else if(nums[i]>second && largest!=nums[i]){
  13.                 second=nums[i];
  14.                 res=i;
  15.             }
  16.         }

  17.         return res;
  18.     }

  19.     public static void main(String[] args){
  20.         int[] nums1={1,4,3};
  21.         int[] nums2={5,4,4,3,2,5,0};
  22.         int[] nums3={6,6,1,6,5,3,5,2,1,3};
  23.         int[] nums4={3,4,1};
  24.         findSecondMaxIndex test=new findSecondMaxIndex();
  25.         System.out.println(test.findSecondIndex(nums1)==2);
  26.         System.out.println(test.findSecondIndex(nums2)==1);
  27.         System.out.println(test.findSecondIndex(nums3)==4);
  28.         System.out.println(test.findSecondIndex(nums4)==0);
  29.     }
  30. }
复制代码
放下我的最终code
回复

使用道具 举报

🔗
vvqqdd 2021-8-29 02:46:06 | 只看该作者
全局:

挺牛的 感觉我一时半会写不出这种
回复

使用道具 举报

全局:
Shubin_ren 发表于 2021-08-26 17:52:25
这个用一个两元素最小堆不是更简单…
这样不行吧

补充内容 (2021-08-29 03:03 +08:00):
两元素最小堆只能保证第一个最小没法保证第二个次小
回复

使用道具 举报

全局:
第二个条件加个小于largest不就好了?
回复

使用道具 举报

全局:
美帝马甲 发表于 2021-08-28 09:59:34
package ThirdReplace;

public class findSecondMaxIndex {
这样还是2N啊,跟用一个array没区别。假如input就是一个单调递增的array,那么每次你都要把所有的variables都往后shift一位,然后再update最大那个。如果是找第k大的那个element,那么你需要2k个variables,每个iteration要shift 2k-2次加上update最大那个,所以每次iteration的cost还是k,总共仍然是kN。

其实这个题的通用形式就是input size N,find the k-th/top-k min/max element(s),其中N和k都是变量。解法基本是一样的,只不过当给定k是constant且比较小的时候,会有更简单的写法,但是无法降低complexity(除非有其它条件,比如input是排序好的)。
回复

使用道具 举报

全局:
这道题到底难点在哪儿啊?LZ是没有考虑到element可能相等的情况嘛?相同element的index存个list不就行了吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表