找出整型数组中占比超过一半的数 | 豆包MarsCode AI刷题

51 阅读4分钟

学习笔记

  • 整型数组中找占比超一半的数

一、题目解析

思路 本题使用了摩尔投票算法来解决。核心思路是在遍历数组时,维护一个候选数(candidate)和它的计数(count)。

  • 初始化count为0,candidate为任意值(这里初始化为0,不过在循环中会根据实际情况更新)。
  • 开始遍历数组中的每个数num
  • count为0时,将当前数num设为candidate,因为此时没有当前的“多数候选”。
  • 如果当前数numcandidate相等,说明找到了一个与候选数相同的数,count加1。
  • 如果当前数numcandidate不相等,说明遇到了不同的数,count减1。
  • 由于题目中保证了存在一个数出现次数超过数组长度的一半,所以最后剩下的candidate就是我们要找的数。 ### 代码详解 以下是代码: java public static int solution(int[] array) { int count = 0; int candidate = 0; for (int num : array) { if (count == 0) { candidate = num; } if (num == candidate) { count++; } else { count--; } } return candidate; }
  • for循环中,for (int num : array)这种增强型for循环方便地遍历数组array中的每个元素num
  • count == 0时,重新选择candidate,这是算法的关键步骤之一。通过不断地根据count的值来更新candidate和调整count,最终找到占比超过一半的数。

二、知识总结

新知识点

  • 摩尔投票算法
  • 理解:摩尔投票算法是一种用于在一个序列中找出出现次数超过一半的元素的高效算法。它利用了多数元素的特性,通过抵消不同元素的方式,最终留下的就是多数元素。这个算法的时间复杂度为O(n)O(n),空间复杂度为O(1)O(1),在处理大规模数据时非常高效。 - 学习建议:对于入门同学来说,要理解算法中计数和候选元素更新的逻辑。可以通过手动模拟算法在一些简单示例上的执行过程,比如[1,1,2,1]这样的数组,来加深对算法的理解。同时,思考为什么这种抵消的方式最终能找到多数元素,理解其背后的数学原理。

三、学习计划

刷题计划制定

  • 利用 AI 刷题功能:使用豆包MarsCode AI 刷题系统,首先可以根据题目类型和难度对题库进行筛选。对于这种算法类题目,可以先从简单难度开始,熟悉基本的算法思路和代码实现。比如,每天完成2 - 3道同类型的简单题目,巩固基础。
  • 逐步增加难度:当对简单题目掌握熟练后,再逐步挑战中等难度和高难度的题目。可以根据 AI 系统的推荐,或者自己主动搜索相关进阶题目。例如,每周安排2 - 3天来挑战中等难度题目,每次完成1 - 2道,深入理解算法的优化和变形。
  • 定期复习和总结:每完成一个阶段的刷题,比如完成了一周的简单题目或者一个月的所有难度题目后,要进行复习。回顾自己做过的题目,总结解题思路和遇到的问题。

利用错题针对性学习

  • 分析错题原因:在刷题过程中,对于做错的题目,仔细分析原因。是因为对算法理解错误,还是代码实现细节问题。例如,如果是对摩尔投票算法中count的更新逻辑理解错误,就重新复习算法原理,查看相关资料或者向他人请教。
  • 建立错题本:可以利用 AI 刷题系统的错题记录功能(如果有),或者自己手动建立错题本。将错题整理出来,包括题目、错误答案、正确答案和错误原因分析。定期重新做错题,直到完全掌握。

四、工具运用

AI 刷题与其他学习资源结合

  • 与在线教程结合:在使用豆包MarsCode AI 刷题的同时,可以结合在线的编程教程网站。比如,在学习算法类题目时,如果对某个算法理解不清楚,可以在教程网站上搜索相关的算法讲解文章或者视频。例如,对于摩尔投票算法,可以在网上搜索详细的动画演示教程,加深对算法的理解,然后再回到 AI 刷题系统中练习相关题目。
  • 与编程论坛结合:如果在刷题过程中遇到问题或者有疑问,可以在编程论坛上提问。与其他开发者交流,获取不同的思路和解决方案。同时,也可以参与论坛上的算法讨论话题,分享自己的解题经验,从他人的经验中学习。这样可以拓宽学习渠道,提高学习效果。