LeetCode | Search Insert Position(查找插入位置)

本文介绍了一种高效查找有序数组中目标值插入位置的方法,包括顺序查找和二分查找两种策略,并指出常见错误如参数检验不充分及数组长度获取方式不当。文章详细解释了每种方法的原理、优点和应用场合,旨在提升算法理解和实践能力。

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


Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.

You may assume no duplicates in the array.

Here are few examples.
[1,3,5,6], 5 → 2
[1,3,5,6], 2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6], 0 → 0


在有序数组中查找关键字,找到返回下标,没找到,就返回其要插入的位置。

方案一:顺序查找

找到第一个大于等于key的位置,就是说要求解的。方法很简单,但查找效率有点低。


方案二:二分查找

碰到查找问题,就要尽量利用二分查找来实现,可以降低程序的时间复杂度。


题目很简单,但是碰到了两个失误的地方:

1:输入参数的检验。没有养成一个好习惯,要时刻记着输入参数是否符合要求。

2:求一个数组的长度,如果sizeof()中是数组名,就能通过sizeof(arr)/sizeof(int)来求解。如果是传入函数中的指针,则arr只占据了一个指针的空间!虽然知道这个知识点,但容易遗忘。以后,如果函数中需要数组的长度信息,就必须以参数的形式传入!

#include <stdio.h>
#include <stdlib.h>

int SearchInsertPosition(int arr[],int n, int key);
int SearchInsert(int arr[], int n, int key);


int main(void)
{
	int arr[] = { 1, 3, 5, 6 };
	int key;

	int len = sizeof(arr) / sizeof(int);	//失误二:将该变量放入函数中调用期望得到数组长度,但传进函数的是指针,求的结果为1!
	while (scanf_s("%d", &key,1) != EOF){
		int res = SearchInsert(arr, len, key);
		printf("%d\n", res);

	}

	return 0;
}

//函数中需要数组的长度,必须以显示的参数形式传递,没有别的方法获取长度。
int SearchInsertPosition(int arr[],int n,int key)	
{
	int i;

	if (arr == NULL || n == 0)	//失误一:没有判断输入条件
		return 0;
	for (i = 0; i < n; ++i){
		if (arr[i] >= key){
			break;
		}
	}

	return i;
}

//利用二分查找提高查找速度!
int SearchInsert(int arr[], int n, int key)
{
	if (arr == NULL || n == 0)
		return 0;
	int left = 0, right = n - 1, mid = 0;
	while (left <= right){
		mid = (left + right) / 2;
		if (arr[mid] == key)
			return mid;
		if (arr[mid] > key)
			right = mid - 1;
		else
			left = mid + 1;
	}

	return left;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值