算法学习笔记1 | 数组基础、704. 二分查找、27. 移除元素 | 代码随想录

数组理论基础(C++)

数组是存放在连续内存空间上的相同类型数据的集合。
例: 字符数组
数组的元素是不能删的,只能覆盖。
C++中二维数组是连续分布的。
使用C++的话,要注意vector和array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。如果不确定元素的个数,则使用vector。

数组操作:

int arr[10]; //定义一维数组
int arr[] = {1 ,2 ,3}; //定义一维数组
int arr[10] = {}; //初始化每个元素为0
int arr[10] = {1, 2, 3}; //初始化前三个元素
int* arr = new int[10]{1, 2, 3}; //初始化前三个元素
int len = sizeof(array_name) / sizeof(DataType); //获取数组长度
arr[0] = 10; //数组元素赋值
delete arr; //删除数组
int arr[5][6]; //定义二维数组

int *arr[10];    //包含10个指向int类型指针的数组(指针数组)
int (*arr)[10];  //指向大小为10的整型数组的指针(数组指针)
int *(&arr)[10]; //a是一个数组的引用,数组包含10个指针

vector初始化:

vector<int> vec;        //声明一个int型向量
vector<int> vec(10);     //声明一个初始大小为10的int向量
vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量

vector<int> tmp;
vector<int> vec(tmp);   //声明并用tmp向量初始化vec向量,类似二维数组

vector<int> vec(st.begin(),st.end());//将set转化为vector

vector常见操作:

vec.push_back(3);//在数组的最后添加一个元素
vec.pop_back();//去掉数组的最后一个数据并返回该元素值
vec.insert(index, 3); //在vec[index]之前插入一个元素
vec.insert(vec.begin(), 3); //在vec开头前插入一个元素
vec.insert(vec.end(),10,100);//在vec末尾插入10个元素

vec.erase(vec.begin()+index);//删除arr[index]元素
vec.erase(vec.begin()+index1, vec.begin()+index2);//删除vec里面[index1, index2)的元素
vec.clear(); //删除vec里面的数据,但内存空间没有释放

int front = vec.front(); //获得数组头的元素
int back = vec.back(); //获得数组尾的元素

vector<int>::iterator iter;
iter = vec.begin(); //返回头元素的指针
iter = vec.end(); //返回尾元素的指针 

int len = vec.size(); //返回数组的元素个数

bool isEmpty = vec.empty(); //判断vector是否为空 

sort(vec.begin(),vec.end());//数组排序

704. 二分查找

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

思路:
我在此题使用的是左闭右闭写法。通过比较nums[middle]与target值的大小以缩小搜索区间,大于target则让right = middle-1,小于target则让left = middle+1。
例: 二分查找

时间复杂度:O(log n)
空间复杂度:O(1)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        int middle;
        while (left <= right)
        {
            middle = (right - left)/2 + left;
            if (nums[middle] < target)
            {
                left = middle + 1;
            }
            else if (nums[middle] > target)
            {
                right = middle - 1;
            }
            else
            {
                return middle;
            }
        }
        return -1;
    }
};

27. 移除元素

题目链接:27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路:
例: 移除元素

双指针思想。快指针fast用来获取新数组中的元素,而慢指针slow用来获取新数组中的位置。

时间复杂度:O(n)
空间复杂度:O(1)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.size(); fast++)
        {
            if (nums[fast]!= val)
            {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值