代码随想录训练营第一天
数组基础
基本概念
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