小算法----寻找插入元素的位置

题目如下:

给定一个已经升序排好序的数组,以及一个数 targettarget,如果 targettarget 在数组中,返回它在数组中的位置。

否则,返回 targettarget 插入数组后它应该在的位置。

假设数组中没有重复的数。以下是简单的示例:

[1,3,5,6], 5 → 2

[1,3,5,6], 2 → 1

[1,3,5,6], 7 → 4

[1,3,5,6], 0 → 0

输入格式

第一行输入一个整数 nn。

第二行输入 nn 个整数,表示数组A[n]

第三行输入 targettarget。

输出格式

输出一行,为要求返回的结果。

样例输入

3
1 3 5
2

样例输出

1

题目分析:一开始想到的是,利用二分查找遍历一遍数组,如果找到则返回;如果没有

找到,再遍历一遍数组,找到该元素应该插入的位置。所以,我写了如下代
码:

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

int findInsertPos(int arr[], int num, int target)
{
	assert(arr);
	if (num <= 0)
	{
		printf("元素个数错误");
		return -1;;
	}
	int left = 0;
	int right = num - 1;
	int i = 0;
	int minIndex = 0;
	while (left <= right)
	{
		int middle = (left & right) + ((left | right) >> 1);
		if (arr[middle] == target)
		{
			return middle;
		}
		else if (arr[middle] < target)
		{
			left = middle + 1;
		}
		else
		{
			right = middle - 1;
		}
	}
	for (i = 0; i < num; i++)
	{
		if (target < arr[i])
			return i;
	}
}
int main()
{
	int num = 0;
	int i = 0;
	int target = 0;
	int *arr = NULL;
	scanf("%d",&num);
	if(num > 0)
	{
		arr = (int *)malloc(num*sizeof(int));
		if (NULL == arr)
		{
			printf("out of memory.");
		}
	}
	else
		return;
	for (i = 0;i < num; i++)
	{
		scanf("%d",arr+i);
	}
	scanf("%d",&target);
	int ret = findInsertPos(arr,num,target);
	printf("%d",ret);
	free(arr);
	arr = NULL;
	return 0;
}

这段代码在我自己的vs下完全运行通过,并且可以得到正确的答案。然而,acm不通

过。总觉得运行超时,所以,利用GetTickCount()函数(所在的头文件:windows.h)

测试程序的运行时间,所得结果是远远超过题目的限时时间。

在草稿纸上推理一番:我们没有必要分情况,直接遍历一次就好了。acm通过的代码展

示:

#include<stdio.h>
#include<malloc.h>
#include<assert.h>

int findInsertPos(int arr[], int num, int target)
{
	assert(arr);
	if (num <= 0)
	{
		printf("元素个数错误");
		return -1;;
	}
	int i = 0;
	for (i = 0; i < num; i++)
	{
		if (target <= arr[i])
			return i;
	}
}
int main()
{
	int num = 0;
	int i = 0;
	int target = 0;
	int *arr = NULL;
	int ret = 0;
	scanf("%d", &num);
	if (num > 0)
	{
		arr = (int *)malloc(num*sizeof(int));
		if (NULL == arr)
		{
			printf("out of memory.");
		}
	}
	else
		return 0;
	for (i = 0;i < num; i++)
	{
		scanf("%d", arr + i);
	}
	scanf("%d", &target);
	if (ret >= 0)
	{
		ret = findInsertPos(arr, num, target);
		printf("%d", ret);
	}
	free(arr);
	arr = NULL;
	return 0;
}

这样就符合题目要求,因为数组是升序,所以一趟循环就好了。题目看似和简单,但

是,算法最优就很重要了。

时间: 2024-10-10 12:54:43

小算法----寻找插入元素的位置的相关文章

小算法---寻找最小的不能由n个数选取求和的数

题目描述如下: 看到这个题目,最容易想到的是暴力搜索法.然而,那不是好的办法,也是acm无法通 过的办法. 思路分析:对于给定的数组,我们必须先对其进行小到大的排序.如果最小的数不是 1(大于1),输出的结果必然就是1啦.如果是1,通过当前数与前边所有数的和加1进 行比较,如果当前数小于等于前边数的和加1,那么当前数也是可以找到它的几个因数 的:否则,直接返回前边数的和加1.跳出循环的有两种情况,break和循环终止条件,如 果是终止条件出来的,那就是说明从1到数组中所有元素的和,都可以找到它的

小算法--数组中元素的移动

题目描述:给定一个数组,假定这个数组中多个0,并且其他元素都各出现一次, 试将所有的0移到数组的尾部. 举例: 给定数组:  1,3,0,5,7,0,3,4 最后所得数组:1,3,5,7,3,4,0,0 下边给出两种方法实现: 方法一:原理就是遇到0的时候,后边的元素统一向前移动.如果前边是1个0,后边元素 向前移动一个,如果两个0,后边元素向前移动2个,以此类推,最后将后边的元素填充为 0即可. 代码实现: #include<stdio.h> void moveZeros(int arr[]

插入元素到有序数组,二分搜索查找插入位置

当一个数组有序时,要向其中插入元素,可以先使用二分搜索查找其要插入的位置,位置确定后可以执行插入操作. 其中二分搜索的循环体如下(部分代码,具体见文章最后): while(low<=high){//循环条件 mid = (low+high)/2; if(a[mid]<val){ low = mid+1; }else if(a[mid]>val){ high = mid-1; }else{ insert(a,last,mid,val);//a[mid]==val,执行插入操作 return

《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)

最近在读<数据结构.算法与应用>这本书,把书上的习题总结一下,用自己的方法来实现了这些题,可能在效率,编码等方面存在着很多的问题,也可能是错误的实现,如果大家在看这本书的时候有更优更好的方法来实现,还请大家多多留言交流多多指正,谢谢 8. 从左至右检查数组a[0:n-1]中的元素,以查找雨x相等的那些元素.如果找到一个元素与x相等,则函数返回x第一次出现所在的位置.如果在数组中没有找到这样的元素,函数则返回-1. // // main.cpp // Test_08 // // Created

1142: 零起点学算法49——找出数组中最大元素的位置(下标值)

1142: 零起点学算法49--找出数组中最大元素的位置(下标值) Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 1937  Accepted: 977[Submit][Status][Web Board] Description 找出数组中最大的元素的下标. Input 多组测试,每组先输入一个不大于10的整数n 然后是n个整数 Output 输出这n个整数中最大的元素及下标值 Sample I

如何在JS数组特定索引处指定位置插入元素?

需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组var array = ["one", "two", "four"];// splice(position, numberOfItemsToRemove, item)// 拼接函数(索引位置, 要删除元素的数量, 元素)array.splice(2, 0, "three"); // www.jbxue.comarray;

数据结构与算法 4:排序算法,选择/插入/冒泡/希尔/快速/归并

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 排序算法 平均复杂度 冒泡排序    O(n2) 选择排序     O(n2) 插入排序     O(n2) 希尔排序     O(n1.5) 快速排序    O(N*logN) 归并排序     O(N*logN) 堆排序     O(N*logN) 基数排序     O(d(n+r)) 选择排序: [email protected]://990487026.blog.51cto.com~/sort$ c

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }

小算法-计算下一个排列

2 8 5 3 1 1.从后往前,找到第一个逆序的数 pivot 2.从后往前,找到第一个比pivot大的数 change 3.交换 pivot 和 change的值 4.把pivot这个位置后面的数 reverse,就是 8 5 2 1变成 1 2 5 8 最终为3 1 2 5 8 #include <iostream> #include <vector> #include <algorithm> using namespace std; /* * num.begin