如何在给定的整数数组中找到重复的数字?

解一、

最先涌现的想法是遍历一遍数组,用hash表记录每一个数字出现的次数;

用空间换时间

解二、

剑指offer解法

重新排序数组每个数字,当扫描到数字m的时候判断下标为i的数字是否等于m:如果是,就寻找下一个;如果不是,就判断下标为m的对应的数字是否等于m,如果它与第m个数字相等,就等于找到了一个重复的数字,如果不相等就把第i个数与第m个数交换位置,把m放在其对应的下标m的位置。

例如:

首先给定数组arr[] = {2, 3, 0, 1, 3}。因为数组中最大的数是n-1,那就一个萝卜一颗坑。从0号下标位置开始,0号元素为2,不等于0,交换0号和2号位置,数组变为: 
{0, 3, 2, 1, 3}。再比较0号位置,下标和值相等,往后走到1号下标元素为3,不等于1,交换1号和3号,变成:{0, 1, 2, 3, 3}。再继续,下标来到4号位置,发现元素下标与值不相等,比较4号和3号下标位置,发现元素相等,返回3即可。
--------------------- 
作者:askunix_hjh 
来源:CSDN 
原文:https://blog.csdn.net/m0_37925202/article/details/81415825 
版权声明:本文为博主原创文章,转载请附上博文链接!

解三、

根据区间数字个数,判断是否有重复数字。

比如:统计小于5的数字个数——有6个数字,那么就有重复的。因为小于5的数字只有:0,1,2,3,4 五个。

(但我觉得这个是特例,如果小于5的数字有五个但是0,0,0,0,0呢?)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用二分查找算法来找到给定数字最接近的值。首先,对整数数组进行排序,然后使用二分查找算法来查找给定数字数组的位置。如果给定数字数组存在,则返回该数字。如果给定数字不在数组,则返回与给定数字最接近的值。在二分查找过程,可以使用一个变量来记录与给定数字最接近的值,并在每次比较时更新该变量。如果当前比较的值更接近给定数字,则更新该变量。最终,返回记录的最接近值即可。 ### 回答2: 题目描述: 给定一个排好序(非降序)的整数数组,以及一个目标数字。需要在数组找到一个与目标数字最接近的值,并返回该值。 解题思路: 由于数组已经排好序,可以考虑使用二分搜索来快速查找最接近的数字。 具体实现时,可以采用双指针法,分别从数组的头部和尾部开始查找,向间靠拢,直到两个指针相遇。每次比较两个指针指向的数字与目标数字之间的差距,找到最小的差距对应的数字即可。 代码实现: 以下是 Python 代码实现。为了方便,本题将查找最接近的值的函数封装成了一个类,可以在其他代码直接调用。 class FindClosestValue: def find_closest_value(self, nums, target): left, right = 0, len(nums) - 1 min_diff = float("inf") while left <= right: mid = (left + right) // 2 diff = abs(nums[mid] - target) if diff < min_diff: min_diff = diff closest_value = nums[mid] if nums[mid] == target: return nums[mid] elif nums[mid] < target: left = mid + 1 else: right = mid - 1 return closest_value 测试样例: 以下是测试样例。 # 测试样例 nums = [-1, 2, 3, 4, 5, 6, 7, 10, 11, 15] target = 8 f = FindClosestValue() print(f.find_closest_value(nums, target)) 上述代码输出结果为 7。 ### 回答3: 对于一个排好序的整数数组,我们可以采用二分查找的方式来找到给定数字最接近的数。具体步骤如下: 1. 定义一个变量diff用来保存最小差值,初始化为正无穷大。 2. 定义左右两个指针left和right分别指向数组的第一个和最后一个元素。 3. 在while循环,不断比较mid位置的元素与给定数字的差值和diff的大小,根据大小调整指针left和right的位置。 4. 当left和right重合时,循环结束,返回该位置的元素值即为与给定数字最接近的数。 具体代码实现如下: ``` public int findClosest(int[] nums, int target) { int diff = Integer.MAX_VALUE; int left = 0, right = nums.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return nums[mid]; } else if (nums[mid] > target) { right = mid - 1; } else { left = mid + 1; } diff = Math.min(diff, Math.abs(nums[mid] - target)); } // 找到最小差值对应的数 for (int i = 0; i < nums.length; i++) { if (Math.abs(nums[i] - target) == diff) { return nums[i]; } } return -1; // 数组为空或未找到 } ``` 需要注意的是,当数组为空或未找到符合条件的元素时,需要返回一个特定值,这里是-1。此外,当存在多个最接近的数时,需要返回其任意一个。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值