数据结构----线性结构--顺序存储--数组

数据结构----线性结构–顺序存储–数组

数组:类型相同,空间连续,长度固定

搜索:

(1)基于索引搜索,空间复杂度O(1)

(2)基于数值搜索:

​ 1.有序的:二分查找

​ 2.无需的:遍历一遍O(n)

增删:

​ 空间不够:扩容 旧数据->新数据 迁移

​ 空间足够:尾增尾删O(1) 其他增删O(n)

关于数组特性的题

第一题

题目:给一个有n个元素的数组,数组内的元素数值范围在0~n-1之间。请检测:数据有无重复出现,如果出现请报错

解决方法:1.暴力 时间复杂度O(n的平方) 空间复杂度 O(1)

​ 2.计数 时间复杂度O(n) 空间复杂度 O(n)

​ 3.排序: 时间复杂度O(看利用哪种排序) 空间复杂度 O(看利用哪种排序)

​ 4.set/map 时间复杂度O(nlog2的n次方) 空间复杂度O(nlog2的n次方)

​ 5.交换 时间复杂度O(n) 空间复杂度 O(1)

这里交换的方法最好 我们用代码实现一下

#include
using namespace std;

//判断的函数
void PanDuan(int a[],int length) {
	for (int i = 0; i < length;) {//遍历
		if (a[i] == i) {//如果下标和数对上了就下一个
			i++;
		}
		else {
			if (a[i] == a[a[i]]) {//重复
				cout << "错误" << endl;
				break;
			}
			else {//不重复交换位置
				int t;
				t = a[i];
				a[i] = a[a[i]];
				a[t] = t;
				                      
			}
	}
}
int main() {

	int a[] = { 0,3,2,4,1 };//定义一个数组,进行测试
	PanDuan(a,(sizeof(a)/sizeof(a[0])));//进入判断的函数
	
	return 0;
}

第二题

题目:一组数据,其中有一个元素只出现一次,其他元素均出现两次,请找出只出现一次的元素

解决方法:1.暴力 时间复杂度O(n的平方) 空间复杂度 O(1)

​ 2.计数 (哈希表,map)

​ 哈希表 时间复杂度O(n) 空间复杂度 O(n)

​ map 时间复杂度O(nlog2的n次方) 空间复杂度 O(n)

​ 3.异或 时间复杂度O(n) 空间复杂度 O(1)

更改题目为:一组数据,其中有两个元素只出现一次,其他元素均出现两次,请找出只出现一次的元素

最优解决方法: 第一步:整体异或

​ 第二步:找到非0位

​ 第三步:根据非0位进行分组,分为两组

​ 第四步:各组异或 就得到了只出现一次的这两个元素

用代码进行实现,如下

#include 
using namespace std;

void Find(int arr[]){
    int res1 = 0;
    for (int i : arr) {//全部异或一遍 获得两个只出现一次元素的异或的结果
        res1 ^= i;
    }

    unsigned int res2 = 1;//从右到左找到二进制上第一个为1的
    while (1) {//与1进行位于
        if (res1 & res2) {
            break;
        }

        res2 = res2 << 1;

    }
    int result1 = 0;
    int result2 = 0;
    for (int i : arr) {//遍历分类并对两组数进行异或得到结果

        if (res2 & i) {
            result1 ^= i;
        }
        else {
            result2 ^= i;
        }
    }
    cout << result1 << "   " << result2 << endl;
}
int main() {
    int nums[] = { 1,5,5,4,4,3 };//这里是测试样例
	Find(nums);
	return 0;
}

你可能感兴趣的:(数据结构,数据结构)