- 二分查找
- 删除数组中的元素
- 有序数组的平方
- 长度最小的子数组
- 螺旋矩阵
删除数组中的元素
两种方法:1.暴力遍历:可以采用两个循环(嵌套使用),外层循环进行遍历,遇到要删除的元素就进行内层循环(用来把删除元素覆盖掉),
for (int i = 0; i < size; i++) {
if (a[i] == target) { // 发现需要移除的元素,就将数组集体向前移动一位
for (int j = i + 1; j < size; j++) {
a[j - 1] = a[j];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
要不然会少判断现在这个位置上的数是否需要移除。
size--; // 此时数组的大小-1
}
2.双指针法:slow和fast fast用来遍历将要删除的数和不需要删除的数区分开,slow作为数组下标,当fast遇到需要留下的数,slow才会更新
for(fast=0;fast<size;fast++)
{
if(a[fast]!=target) //遇到被删的元素会跳过 ,这样可以完成元素的覆盖
{
a[slow]=a[fast];
slow++;
}
}
有序数组的平方
平方的最大值肯定从两端开始取(有序),可能含有负数,所以用双指针法
双指针法:两端都来一个指针,比较两个指针所指的数的大小,取大的数优先放进新的数组中
int k=size-1; //先取的是最大值,所以先从最后边开始,
for(int i=0;j=size-1;i<=j) //取等号的原因是当i与j相等时的数不能漏掉
{
if(a[i]*a[i]>a[j]*a[j])
{
result[k--]=a[i]*a[i];
i++;
}
else{
result[k--]=a[j]*a[j];
j--;
}
}
长度最小的子数组
双指针法:一个指针( i )控制终止位置,另一个指针 ( j ) 控制起始位置,j 先位于开头位置不动, i 不断向后移,直到 i 与 j 之间的数值总和大于s,然后 i 不动,控制 j 向后走,直到满足条件时所需的最小长度。
//伪代码
int result=9999999;
for(i=0;i<size;i++)
{
sum+=a[i];//i与j之间的总和
while(sum>s) //用while不用if是因为不能判断减去一个起始位置的数值剩下的长度是否是最小的长度。
{
L=i-j+1;//i与j之间的长度
if(L<result)
{
result=L;
}
sum-=a[j];
j++;//起始位置移动,缩短长度。
}
}
螺旋矩阵
//伪代码 先规定为左闭右开
start=0;
offset=1;
count=1;//数值
while(n/2) //n/2为所需要转的圈数
{
//然后开始转圈,只要搞明白第一圈,后边的圈是一样的
for(j=start;j<n-offset;j++) //因为每一圈开始的位置不一样,所以j最开始的位置不能固定,所以j=startx,并且越往内圈走j最后的值逐渐减小,所以j<n-offset,(从左至右)
a[start][j]=count++;
for(i=start;i<n-offset;i++)
a[i][j]=count++;//因为此时的j在最后一个位置,所以直接是j了
for(;j>start;j--)
a[i][j]=count++;
for(;i>start;i--)
a[i][j]=count++;
start++;offset++;
}
if(n%2==1)
{
a[start][start]=count;
}