(58同城)【算法】找到有重复元素的有序数组的某个值第一次出现的位置

本文介绍了一种在已排序的数组中查找特定值首次出现位置的方法,通过修改二分查找算法,确保找到的是目标值的首个实例。该算法适用于含有重复元素的数组,能够有效地定位目标值的起始索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找到有重复元素的有序数组的某个值第一次出现的位置

public static void main(String[] args) {
	// 排好序的数组,有重复元素
	int[] nums = { 1, 6, 6, 6, 78, 78, 78, 1000 };
	Test2 test2 = new Test2();
	int a = test2.getVal(nums, 78);
	System.out.println("该数所在数组索引为" + a);
	if (a != -1) {
		if (a > 0 && nums[a - 1] == nums[a]) {
			while (a - 1 >= 0 && nums[a - 1] == nums[a]) {
				a--;
			}
			System.out.println("该数所在数组第一个索引为" + a);
		} else {
			System.out.println("该数所在数组第一个索引为" + a);
		}
	}
}
private int getVal(int[] nums, int value) {
	// 声明中间值
	int middle = 0;
	// 声明开始值
	int start = 0;
	// 声明结束值
	int end = nums.length;
	// 用for循环是知道循环的次数,此处用while是因为不知道能循环多少次,且算法中开始值只能小于结束值
	while (start < end) {
		// 每次循环重新定义中间值
		middle = (start + end) / 2;
		// 当中间元素等于查找的元素,输出中间元素的索引,返回
		if (value == nums[middle]) {
			return middle;
		} else if (value > nums[middle]) {
			// 如果中间元素小于查找值,开始值加一
			start = middle + 1;
		} else if (value < nums[middle]) {
			// 若果中间元素大于查找值,结束值减一
			end = middle - 1;
		}
	}
	// 在上述的循环中没有找到值,则证明不存在
	System.out.println("没该数");
	return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值