代码随想录训练营第一天

代码随想录训练营第一天

数组基础

基本概念

1、数组下标从0开始
2、数据在内存空间中的地址是连续的‘
在C++中二维数组的地址也是连续的

二分查找

一、适用条件:数组是顺序排列,并且数组元素中无重复元素

二、算法基本流程

step1:设定起始指针left,终止指针right
step2:求解数组的中间值
step3:用中间值与目标值target比较,改变left和right的相应大小,确定出target所在的新区间,重复以上步骤,直至找到target在数据中的位置或循环结束
一点思考:
在算法执行的过程中有一个假设,假如target在当前数组中时,必然被该数组的首尾所包含,即arr[left]<=target<=arr[right] (使用左闭右闭时),或arr[left]<=target<arr[right] (使用左闭右开)
当left大于right时,有target>arr[left]&&target<arr[right],此时arr[left]>arr[right]时,无解,所以循环结束,并且判定在该数组中找不到该目标值。

左闭右闭代码

int find(int *arr,int target,int L)
{
	int left =0;
	int right=L;
	while(left<=right)
	{
		int middle=(left+right)/2;
		if(arr[middle]>target)
		{
			right=middle-1;//不在右侧二分之一区间
		}
		else if(arr[middle]<target)
		{
			left=middle+1;
		}
		else
			return middle;
	}
	return -1;//跳出循环说明该target没有在该数组中
}

左闭右开代码

int find(int *arr,int target,int L)
{
	int left =0;
	int right=L;
	while(left<right)
	{
		int middle=(left+right)/2;
		if(arr[middle]>target)
		{
			right=middle;//不在右侧二分之一区间
		}
		else if(arr[middle]<target)
		{
			left=middle+1;
		}
		else
			return middle;
	}
	return -1;//跳出循环说明该target没有在该数组中
}

移除元素

Leetcode27题
题目描述:原地移除所有等于value的元素,要求不能使用额外的内存空间返回移除元素后新数组的大小
由于不能使用额外的空间,那么就必须在原来的数组上进行覆盖移动。

暴力循环

使用两个循环,第一个循环先依次找到数组中与value相等的元素的位置,把其后的所有的元素在第二个循环中向前移动一位,实现覆盖,当第一个循环结束时,完成了元素的移除,代码如下

int remove_arr(int* arr, int value,int size_arr)
{
	
	for (int i = 0; i < size_arr; i++)
	{
		if (arr[i] == value)
		{	
			
			for (int j = i; j < size_arr - 1; j++)
			{
				arr[j] = arr[j + 1];//将该值以后的所有的元素向前移动一位,覆盖了该值
				
			}	
			size_arr -= 1;
		}
	}
	return size_arr;
}

快慢指针

使用两个指针,一个快指针负责向前遍历数组,一个慢指针,负责记录下一个与value不相等的值时的位置。其算法运行为,当快指针所指示的元素值与value不相同时,慢指针随快指针一起向前走,每次向前走一个,当快指针指示的值与value相同时,快指针单独向前走一步,慢指针停在原地。代码如下

int remove1(int* arr, int value, int size_arr)
{
	int ptr = 0;
	int newsize = size_arr;
	for (int i=0;i<size_arr;i++)
	{
		if (arr[i] != value)
		{
			arr[ptr] = arr[i];
			ptr++;
		}
	}
	return ptr;
}
																		2022年9月21日下午by Horizon
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值