算法文章目录
第一题
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
算法的重要性:算法 + 数据结构 = 程序 ,算法就是让程序更高效的运行,比如为什么Google浏览器要更新,就是在更新算法,是浏览器运行的更快更高效更流畅
提示:以下是本篇文章正文内容,下面案例可供参考
一、算法题目
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。
请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
二、算法思想
1.读懂题目的意思
从题目中我们首先要知道这个题目让我们干嘛,很明显题目要求我们进行查找相同数字。其次我们要看给的条件,题目所给的条件有两个,一个就是数组长度,另一个就是所有数字大小都没有超过数组长度。最后我们不难理解到题目只要求我们找到其中一个重复的数字输出即可。
2.找到算法的突破口,也就是思路
要找的算法的突破口很简单,我们得了解到算法最终的结果是什么就可以,本题题目要求我们找到相同的数字即可,那我们最开始就会想到采用两个for循环来进行遍历,外循环确定一个数,内循环确定比较的对象。这是最容易想到的,但是这样的循环时间复杂度太高,一旦数据量过大,就很浪费时间。
所以我们就想到了采用先排序,然后比较,只要相邻的两个元素值相等就输出,这样就大大降低了时间复杂度。
第二种想法就是想到哈希表。将相同的值存储到相同的下标里面,如果已经有了那就输出,没有就交换,如果没有一个重复的那么就会输出排序好的数组并且值和下标一一对应。
3.算法具体实现代码
//使用双重for循环
private static int show2(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = i; j <nums.length ; j++) {
if (nums[i]==nums[j]){
return nums[i];
}
}
}
return -1;
}
//使用哈希表特点
private static int show(int[] nums) {
int tmp ;
for (int i = 0; i < nums.length; i++) {
while (nums[i]!=i){
if(nums[i]==nums[nums[i]]){
return nums[i];
}
tmp = nums[i]; //交换使值进入下标所在位置
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
}
return -1;
}
总结
本次算法主要思想是找到重复元素即可不需要考虑总共有多少个重复的元素。所以我们还可以用Set集合来实现(set集合的的特点就是不允许有重覆元素添加,如果添加就会覆盖),只要往set放元素,一旦发生覆盖就找到重复元素。