【蓝蓝计算机考研算法】-day20-搜索目标值&&原地修改数组

98 阅读2分钟

28、搜索目标值

题目:给定一个n个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target ,如果目标值存在返回下标,否则返回 -1。

示例1:

输入:nums = [-1, 0, 3, 5, 9, 12],target = 9

输出:4

解释:9 出现在 nums 中并且下标为4

示例2:

输入:nums = [-1, 0, 3, 5, 9, 12],target = 2

输出:-1

解释:2 不存在 nums 中因此返回-1

提示:

  • 你可以假设 nums 中所有的元素是不重复的。
  • n 将在[1, 10000]之间
  • nums 的每一个元素都将在[-9999, 9999]之间

思路

[使用二分查找可参考](704.二分查找 - 掘金 (juejin.cn))

代码实现

#include <stdio.h>
int main()
{
    int a[100];
    int x, n = 0, target;//x是存入数组的值,n是记录个数,target是需要找的值 
    int flag = 0;//设置一个信号量用来判断是否已经找到目标值
    while (scanf_s("%d",&x))//输入数组
    {
        a[n++] = x;
        if (getchar() == '\n')
            break;
    }
    printf("输入目标值:");
    scanf_s("%d", &target);//输入目标值
    for (int i = 0; i < n; i++) {
        if (a[i] == target) {
            printf("%d", i);//输出下标值
            flag = 1;//赋值为1表示已找到
            break;
        }
        else {
            continue;//没找到,继续循环
        }
    }
    if (flag == 0) {
        printf("-1");//若目标值为0.则未找到,输出-1
    }
    return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度 O(n)-- - 遍历判断是否有相等值,共需判断n次,n是数组的长度
  • 空间复杂度O(1)-- - 无额外存储空间,仅常熟级空间,用到的数组也是有限个

29、原地修改数组

题目:给你一个数组 nums 和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。

  • 不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。
  • 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例1:

给定 nums = [3, 2, 2, 3],val = 3,
函数应该返回新的长度2,并且 nums 中的前两个元素均为2。你不需要考虑数组中超出新长度后面的元素。

示例2:

给定 nums = [0, 1, 2, 2, 3, 0, 4, 2],val = 2,
函数应该返回新的长度5,并且nums中的前五个元素为 0, 1, 3, 0, 4。 你不需要考虑数组中超出新长度后面的元素。

思路

  • 首先输入数组元素和val,定义一个count值记录最新数组长度,并赋值为0,用来计算元素个数,即新数组长度。
  • 然后遍历数组,当元素值与val不同时,cnt++,当元素值与val值相同时,继续遍历。
  • 最后输出count,即数组新长度。
  • 其他方式可参考[:27.移除元素 - 掘金 (juejin.cn)]

代码实现

#include<stdio.h>

//原地修改数组
int main() {
	int num[100], val;//num[]数组和特定值
	int x, n = 0,count=0;//x是存入数组的值,n是原始数组的长度,count新的数组长度
	while (scanf_s("%d",&x))
	{
		num[n++] = x;	//往数组里存值
		if (getchar() == '\n')//输入换行时结束
			break;
	}
	printf("输入移除的值:");
	scanf_s("%d", &val);
	printf("新数组的元素: ");
	for (int i = 0; i < n; i++) {
		if (num[i] != val) {//如果数组里的值没有不等于val的
			count++;
			printf("%d ", num[i]);
		}
		else {
			continue;//continue;//结束本次循环,进行下一次循环。
		}
	}
	printf("\n");
	printf("新数组的长度:%d", count);
	return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度 O(n)-- - 遍历判断是否有相等值,共需判断n次,n是数组的长度
  • 空间复杂度O(1)-- - 无额外存储空间,仅常熟级空间,用到的数组也是有限个

小结

break,结束循环;continue,结束本次循环,进行下一次循环。