剑指Offer3

剑指offer 3

题目描述:在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

解题思路:
方法一

  • 先排序,之后顺序扫描判断是否有重复,时间复杂度为O(n^2)

方法二,时间复杂度为O(n)

  • 长度为n,元素的范围也为0~n,如果没有重复元素,则n下标的值也等于n
  • 从头到尾扫描数组,当扫描到下标i的值arr[i]时:
    • 如果arr[i]的值与下标i相等,继续向下扫描,i++;
    • 如果arr[i]与下标i不相等,比较arr[arr[i]]与arr[i]的值,如果相等,返回arr[i]的值,否则交换下标i与下标arr[i]的值,重复这个过程,直至找到为止

方法三:

  • 利用哈希表,遍历数组,如果哈希表中没有该元素,则存入哈希表中,否则返回重复的元素。时间复杂度为 O(n),空间复杂度为 O(n)。

方法一代码如下:

import java.util.Arrays;

public class DuplicationArray {
   
	/**
	 * 先排序,之后判断是否有重复
	 * @param args
	 */
	public static void main(String[] args) {
   
		int[] arr = {
   2, 3, 1, 0, 2, 5, 3};
		Arrays.sort(arr);		//利用库函数进行排序
		boolean flag = duplicated(arr);			//将排序数组传入进行判断
		System.out.println(flag);
	}
	public <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值