刷题day1~数组开始


前言

刷题第一天,数组
1、数组初始化分配内存
int record[26] = {0};
2、vector排序函数:sort(A.begin(),A.end());
3、vector res = {1, 2, 3, 4};
4、vector int res(10,0); // 创建一个大小为10的vector
vector<vector> res(10, vector(10, 0)) // 创建一个10*10的二维vector
5、查找vector中的元素

vector<int>::iterator aa = find(visited.begin(), visited.end(), 5);  // 如果vector是空的,出现段错误
if (aa == visited.end())  没找到
else *aa   找到了返回值

一、数组

1.一维数组

数组通过下标索引的方式获取下标下对应的数据
数组是存放在连续内存空间上的相同类型数据的集合,也就是说数组内存空间的地址是连续的
因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址,注意:数组的元素是不能删的,只能覆盖

2.二维数组

C++中二维数组在地址空间上是连续的
例子

int array[2][3] = {
		{0, 1, 2},
		{3, 4, 5}
    };

二维int型数组内存地址,相邻数组元素差了4个字节
PS:vector的底层实现是array,但严格来讲vector是容器,不是数组。之后补充

二、题

1. 704 二分查找

前提条件:有序数组、无重复元素
着重点:
1、while的退出条件非常重要,小于等于:while(left <= right)
2、取中间值索引时非常重要:int mid = (right - left)/2 + left;
奇数个索引刚好在中间,偶数个索引在中间偏左位置

2. 27 移除元素

题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]

双指针,感觉很难想,需要重点2刷。
核心思想:每次fast都会给slow值,除非fast指向了val
在这里插入图片描述

代码如下(示例):

int removeElement(vector<int>& nums, int val) {
    int slow = 0;
    int fast = 0;
    while(fast < nums.size()){  // 每次fast都会给slow值,除非fast指向了val
        if(nums[fast] != val){
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}

// 2021年第一次做
int fast = 0;
int slow = 0;
int removeElement(vector<int>& nums, int val) {
       for(fast = 0;fast<nums.size();fast++)
       {
           if(nums[fast] != val) //在快和慢没有分开时,当快指针不为val时,带着slow走
           {                     //在快和慢分开之后,,当快指针不为val,每次赋值结束,slow指针自加
               nums[slow] = nums[fast]; //只要不赋值,慢指针就永远不自加
               slow++;
           }
           //当快指针为val时,快指针自己走,第一次快与慢分开的时候就是第一次碰到val的时候
       }
       return slow;
}

补充:
1、暴力解法思路
一个for循环遍历数组,在找到val时,再用for循环将数组的所有元素向前移动覆盖val,O(n^2)
2、vector中erase接口复习

总结

二分查找和双指针,双指针需要2刷

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋雨qy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值