代码随想录刷题 | Day1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 今日学习目标
  • 一、C++数组
    • 内置数组
    • 模板类array
    • 模板类vector
  • 二、算法题
    • 1.二分查找
    • 2.移除元素
  • 今日心得
  • 学习及参考内容


今日学习目标

1.数组理论基础
2.二分查找(704)
3.移除元素(27)

一、C++数组

内置数组

简单复习下C++中数组的一些知识
**声明数组的通用格式:**typeName arrayName[arraySize]
代码随想录刷题 | Day1_第1张图片
数组下标都是从0开始的。
数组内存空间的地址是连续的

模板类array

C++11中新增了模板类array
array是为替代内置数组设计的,通过提供更好、更安全的接口,让数组更紧凑、效率更高。array类模版支持几乎所有内置数组包含的特性,并且可使用容器操作

模板类vector

//头文件
#include

//创建一个vector容器
vector<int> v;

//声明一个迭代器
vector<int>::iterator pd=v.begin();

//添加元素data到末尾
v.push_back(data);

//vector区间左闭右开
//删除给定区间的元素
v.erase(v.begin(), v.end());

//插入,第一个参数指定新元素的插入位置,第二个参数、第三个参数定义了被插入的区间
v.insert(data, v.begin()+1, v.end())

所有的STL容器都提供一些基本方法,包括size()——返回容器中元素数目、swap()——交换两个容器的内容、begin()——返回指向容器中第一个元素的迭代器、end()——返回一个超过容器尾的迭代器。

二、算法题

1.二分查找

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

个人思路:
STL模板长度size()方法;循环条件的判定;判断middle的值是否大于target

代码如下:

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

总结:
1.超出时间限制
当l = 0, r = n的时候因为r这个值我们在数组中无法取到,while(l < r) 是正确写法。
当l = 0, r = n - 1的时候因为r这个值我们在数组中可以取到,while(l <= r) 是正确写法。
2.测试未通过
边界判定问题, right = middle - 1;和left = middle + 1;写反了。

2.移除元素

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

个人思路:
快慢指针;慢指针指向待定的元素,快指针则指向非val元素并且将值赋给慢指针所在的位置。

代码如下:

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];
            }
        }
        return slow;
    }
};

总结:
因为有以前的基础在,这道题先想到了快慢指针解法。思考了一会快慢指针移动的条件,第一个元素为val的时候想到了单独判定,但实际上慢指针一直指向的都是待定的元素。


今日心得

用时:2h30min(加上写博客时间)
之前从未仔细的考虑过边界问题,在通过查看每日精华部分才了解到,要注意是l < r还是l <= r,每次取mid还是取mid加减一。
关于二分mid溢出问题:
mid = (l + r) / 2时,如果l + r 大于 INT_MAX(C++内,就是int整型的上限),那么就会产生溢出问题(int类型无法表示该数)
所以写成 mid = l + (r - l) / 2或者 mid = l + ((r - l) >> 1) 。

学习及参考内容

C++ Primer Plus
代码随想录

你可能感兴趣的:(代码随想录练习,笔记)