首页 > 编程学习 > 一刷代码随想录——数组

    • 概念

数组是存放在连续内存空间上的相同类型数据的集合

连续:增删需移动后续元素,删除的本质是覆盖

类型:相同用数组,不同用结构

数组下标从0开始

C++中二维数组连续分布

vector的底层实现是array,严格来讲vector是容器,不是数组

vector<int> vi;
array<int, 10> arr;

    • 力扣704.二分查找

题目描述:

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

左闭右闭:

class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();if (n == 0) return -1;if (n == 1 && nums[0] != target) return -1;if (n == 1 && nums[0] == target) return 0;if (target < nums[0] || target > nums[n - 1]) return -1;int l = 0;int r = n - 1;int mid = l + (r - l) / 2;while (r != l) {if (target == nums[l]) return l;else if (target == nums[r]) return r;else if (target == nums[mid]) return mid;else if (target > nums[mid]) {l = mid + 1;mid = l + (r - l) / 2;}else if (target < nums[mid]) {r = mid - 1;mid = l + (r - l) / 2;}}return -1;}
};

左闭右开:

class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();if (n == 0) return -1;if (n == 1 && nums[0] != target) return -1;if (n == 1 && nums[0] == target) return 0;if (target < nums[0] || target > nums[n - 1]) return -1;int l = 0;int r = n - 1;int mid = l + (r - l) / 2;do{if (target == nums[l]) return l;else if (target == nums[r]) return r;else if (target == nums[mid]) return mid;else if (target > nums[mid]) {l = mid;mid = l + (r - l) / 2;}else if (target < nums[mid]) {r = mid;mid = l + (r - l) / 2;}} while (mid != l);return -1;}
};

    • 力扣27. 移除元素

题目描述:

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

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

解答:双指针

class Solution {
public:int removeElement(vector<int>& nums, int val) {if (nums.size() == 0) return 0;int s = 0;int f = 0;while (f < nums.size()) {if (nums[f] != val) nums[s++] = nums[f++];else f++;}return s;}
};

4.力扣209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0

解答:滑动窗口

小则右吞,大则左吐

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int re = INT32_MAX;int l = 0, r = 0, sum = 0;for (int r = 0; r < nums.size(); ++r) {sum += nums[r];while (sum >= target) {re = re < (r - l + 1) ? re : (r - l + 1);sum -= nums[l++];}}return re == INT32_MAX ? 0 : re;}
};

5.力扣59.螺旋矩阵II

给你一个正整数 n ,生成一个包含 1n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

解答:左闭右开

class Solution {
public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int c = 1, z = 0;int loop = n / 2;        while (loop--) {int i = z, j = z;for (; j < n - 1 - z; ++j) res[z][j] = c++;for (; i < n - 1 - z; ++i) res[i][j] = c++;for (; j > z; --j) res[i][j] = c++;for (; i > z; --i) res[i][j] = c++;++z;}if (n % 2) res[n / 2][n / 2] = n * n;return res;}
};

本文链接:https://www.ngui.cc/article/show-845583.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000