算法笔记练习 7.3 链表处理 问题 D: 链表查找(线性表)

算法笔记练习 题解合集

本题链接

题目

题目描述
线性表(a1,a2,a3,…,an)中元素递增有序且按顺序存储于计算机内。要求设计一算法完成:
(1) 用最少时间在表中查找数值为x的元素。
(2) 若找到将其与后继元素位置相交换。
(3) 若找不到将其插入表中并使表中元素仍递增有序。

输入
输入:x=3
输入长度:9
输入数据:2 3 5 7 12 15 17 23 45

输出
相同元素为:3
交换后的链表为:2 5 3 7 12 15 17 23 45

样例输入

4
9
2 3 5 7 12 15 17 23 45

样例输出

no
2 3 4 5 7 12 15 17 23 45 

思路

因为题目要求用最少时间,所以就不用链表了,复习一下二分搜索法,找到第一个大于等于待查询元素x的位置,再判断这个位置上的元素是否等于x,做相应操作即可。

代码

#include 
#include 
#include 
using namespace std;
int binarySearch(vector<int>& nums, int left, int right, int x) {
	int mid;
	while (left < right) {
		mid = left + (right - left) / 2;
		if (nums[mid] >= x)
			right = mid;
		else
			left = mid + 1; 
	} 
	if (nums[left] == x) {
		if (left + 1 < nums.size())
			swap(nums[left], nums[left + 1]);
	} else {
		puts("no"); 
		nums.insert(nums.begin() + left, x);
	} 
} 
int main() {
	int x, n;
	scanf("%d%d", &x, &n);
	vector<int> nums(n);
	for (int i = 0; i < n; ++i)
		scanf("%d", &nums[i]);
	binarySearch(nums, 0, nums.size() - 1, x); 
	for (auto i : nums)
		printf("%d ", i); 
	return 0;
} 

你可能感兴趣的:(算法笔记)