代码随想录笔记--数组篇

目录

1--二分查找法

2--二分查找法进阶

2-1--寻找第一个等于目标值的位置

2-2--寻找最后一个等于目标值的位置

3--双指针算法

3-1--快慢指针移除元素

3-2--有序数组的平方

4--滑动窗口算法

5--循环不变量


1--二分查找法

        二分查找法用于有序数组的元素查找,一般可以分为左闭右闭写法、左闭右开写法、左开右闭写法,其中左闭右闭写法最常用;

#include <iostream>
#include <vector>class Solution {
public:// 左闭右闭写法int search1(std::vector<int>& arr, int target){int left = 0, right = arr.size() - 1;while(left <= right){ // 因为是左闭右闭写法,当left == right时[left, right]也是合法的,因此left <= rightint mid = left + (right - left) / 2;if(arr[mid] > target){right = mid - 1;}else if(arr[mid] < target){left = mid + 1;}else return arr[mid];}return -1; // 表示未找到}// 左闭右开写法int search2(std::vector<int>& arr, int target){int left = 0, right = arr.size();while(left < right){ // 因为是左闭右开写法,当left == right时[left, right)是非法的,因此left < rightint mid = left + (right - left) / 2;if(arr[mid] > target){right = mid; // 右开}else if(arr[mid] < target){left = mid + 1; // 左闭}else return arr[mid];}return -1; // 表示未找到}// 左开右闭写法int search3(std::vector<int>& arr, int target){int left = -1, right = arr.size() - 1;while(left < right){ // 因为是左闭右开写法,当left == right时(left, right]是非法的,因此left < rightint mid = left + (right - left) / 2;if(arr[mid] > target){right = mid - 1; // 右闭}else if(arr[mid] < target){left = mid; // 左开}else return arr[mid];}return -1; // 表示未找到}
};int main(int argc, char *argv[]){std::vector<int> test = {1, 2, 3, 4, 5, 6, 7, 8, 9};int target = 2;Solution S1;int res1 = S1.search1(test, target);int res2 = S1.search2(test, target);int res3 = S1.search3(test, target);std::cout << res1 << ", " << res2 << ", " << res3 << std::endl;return 0;
}

2--二分查找法进阶

2-1--寻找第一个等于目标值的位置

等于号 = 放在哪个条件判断的依据:当 arr[mid] == target 时,应该往哪一边继续二分寻找;

#include <iostream>
#include <vector>class Solution {
public:// 左闭右闭写法int search1(std::vector<int>& arr, int target){int left = 0, right = arr.size() - 1;int res = -1;while(left <= right){int mid = left + (right - left) / 2;if(arr[mid] >= target){res = mid; // 记录可能的位置right = mid - 1;}else if(arr[mid] < target){left = mid + 1;}}if(res == -1 || arr[res] != target) return -1; //未找到targetreturn res;}};int main(int argc, char *argv[]){std::vector<int> test = {1, 2, 2, 2, 3, 3, 4};int target = 2;Solution S1;int res1 = S1.search1(test, target);std::cout << res1 << std::endl;return 0;
}

2-2--寻找最后一个等于目标值的位置

等于号 = 放在哪个条件判断的依据:当 arr[mid] == target 时,应该往哪一边继续二分寻找;

#include <iostream>
#include <vector>class Solution {
public:// 左闭右闭写法int search1(std::vector<int>& arr, int target){int left = 0, right = arr.size() - 1;int res = -1;while(left <= right){int mid = left + (right - left) / 2;if(arr[mid] > target){right = mid - 1;}else if(arr[mid] <= target){res = mid; // 记录可能的位置left = mid + 1;}}if(res == -1 || arr[res] != target) return -1; //未找到targetreturn res;}};int main(int argc, char *argv[]){std::vector<int> test = {1, 2, 2, 2, 3, 3, 4};int target = 2;Solution S1;int res1 = S1.search1(test, target);std::cout << res1 << std::endl;return 0;
}

3--双指针算法

3-1--快慢指针移除元素

#include <iostream>
#include <vector>class Solution {
public:int removeElement(std::vector<int>& nums, int val) {int slow = 0, fast = 0;while(fast < nums.size()){if(nums[fast] != val){nums[slow] = nums[fast];slow++;fast++;}else{fast++;}}return slow;}
};int main(int argc, char argv[]){// nums = [3,2,2,3], val = 3std::vector<int> test = {3, 2, 2, 3};int val = 3;Solution S1;int res = S1.removeElement(test, val);std::cout << res << std::endl;
}

3-2--有序数组的平方

主要思路:

        由于数组包含负数,则平方后的数组符合:大→小→大的排列规律;可以利用双指针算法从两端向中间遍历,取最大值放在结果数组(提前开辟); 

#include <iostream>
#include <vector>class Solution {
public:std::vector<int> sortedSquares(std::vector<int>& nums) {std::vector<int> res(nums.size(), 0);int i = 0, j = nums.size() - 1, k = nums.size() - 1;while(i <= j){if(nums[i]*nums[i] > nums[j]*nums[j]){res[k] = nums[i]*nums[i];k--;i++;}else{res[k] = nums[j]*nums[j]; k--;j--;}}return res;}
};int main(int argc, char argv[]){// nums = [-4,-1,0,3,10]std::vector<int> test = {-4, -1, 0, 3, 10};Solution S1;std::vector<int> res = S1.sortedSquares(test);for(auto v : res) std::cout << v << " ";return 0;
}

4--滑动窗口算法

主要思路:

         维护一个滑动窗口,当满足滑动窗口内元素和 》= target 时,判断是否更新最小长度;

#include <iostream>
#include <vector>class Solution {
public:int minSubArrayLen(int target, std::vector<int>& nums) {int i = 0, j = 0;int sum = 0, min_len = nums.size() + 1;while(j < nums.size()){sum += nums[j];while(sum >= target){min_len = std::min(min_len, j - i + 1);//缩小滑动窗口范围sum = sum - nums[i];i++; }j++; //寻找下一个满足条件的滑动窗口}return min_len == nums.size() + 1 ? 0 : min_len;}
};int main(int argc, char argv[]){// target = 7, nums = [2,3,1,2,4,3]std::vector<int> test = {2, 3, 1, 2, 4, 3};int target = 7;Solution S1;int res = S1.minSubArrayLen(target, test);std::cout << res << std::endl;return 0;
}

5--循环不变量

主要思路:

        定义循环不变量:遵循左闭右开的循环遍历规则;

#include <iostream>
#include <vector>class Solution {
public:std::vector<std::vector<int>> generateMatrix(int n) {std::vector<std::vector<int>> res(n, std::vector<int>(n, 0));int offset = 1, count = 1;int start_x = 0, start_y = 0, i, j;int loop = n / 2;while(loop--){i = start_x;j = start_y;// 上边界左闭右开for(; j < n - offset; j++){res[i][j] = count;count++;}// 右边界上闭下开for(; i < n - offset; i++){res[i][j] = count;count++;}// 下边界右闭左开for(; j > start_y; j--){res[i][j] = count;count++;}// 左边界下闭上开for(; i > start_x; i--){res[i][j] = count;count++;}offset++;start_x++;start_y++;}// 如果n为奇数的话,需要单独给矩阵最中间的位置赋值if (n % 2 == 1) {res[n/2][n/2] = count;}return res;}
};int main(int argc, char argv[]){// n = 4int test = 4;Solution S1;std::vector<std::vector<int>> res = S1.generateMatrix(test);for(auto v : res){for(auto item : v) std::cout << item << " ";std::cout << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/89836.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker之Compose与DockerSwarm

目录 Compose 简介 概念 为什么需要&#xff1f; 配置字段 常用命令 安装 1.下载 2.授权 使用 1.创建文件 2.启动 docker Swarm 关键概念 调度策略 spread binpack random 特性 集群部署 1.准备 2.创建swarm并添加节点 在主服务器上创建swarm集群 节点…

亚马逊云科技 云技能孵化营——我的云技能之旅

文章目录 每日一句正能量前言活动流程后记 每日一句正能量 不能在已经获得足够多的成功时&#xff0c;还对自己的能力保持怀疑&#xff0c;露出自信的微笑&#xff0c;走出自信的步伐&#xff0c;做一个自信的人&#xff01; 前言 亚马逊云科技 (Amazon Web Services) 是全球云…

Qt中XML文件创建及解析

一 环境部署 QT的配置文件中添加xml选项&#xff1a; 二 写入xml文件 头文件&#xff1a;#include <QXmlStreamWriter> bool MyXML::writeToXMLFile() {QString currentTime QDateTime::currentDateTime().toString("yyyyMMddhhmmss");QString fileName &…

Spring-SpringBoot-SpringMVC-MyBatis常见面试题

文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载&#xff1f;Mybatis的一…

数组(个人学习笔记黑马学习)

一维数组 1、定义方式 #include <iostream> using namespace std;int main() {//三种定义方式//1.int arr[5];arr[0] 10;arr[1] 20;arr[2] 30;arr[3] 40;arr[4] 50;//访问数据元素/*cout << arr[0] << endl;cout << arr[1] << endl;cout &l…

K8S如何部署Redis(单机、集群)

在今天的讨论中&#xff0c;我们将深入研究如何将Redis数据库迁移到云端&#xff0c;以便更好地利用云计算的优势提高数据管理的灵活性。 Redis(Remote Dictionary Server)是一个开源的、基于内存的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理。Redis支持多…

pinia——添加插件——基础积累

问题&#xff1a;是否给pinia添加过插件&#xff1f;具体添加的方式是什么&#xff1f; 在pinia中&#xff0c;我们可以为仓库添加插件&#xff0c;通过添加插件能够扩展以下的内容&#xff1a; 为 store 添加新的属性 定义 store 时增加新的选项 为 store 增加新的方法 包装现…

Sketch 98 中文版-mac矢量绘图设计

Sketch是一款专为Mac操作系统设计的矢量图形编辑软件&#xff0c;被广泛应用于UI/UX设计、网页设计、移动应用设计等领域。Sketch提供了各种工具和功能&#xff0c;包括绘图、图形设计、排版等&#xff0c;可以帮助设计师轻松地创建高质量的矢量图形和模型。Sketch的主要特点包…

防溺水智能预警系统解决方案 yolov7

防溺水智能预警系统解决方案采用yolov7先进的AI视觉识别算法模型框架&#xff0c;防溺水智能预警系统解决方案算法实现对危险水域人员活动、水面情况等各项指标的监测和分析。当发现有人进入危险水域或出现紧急情况时&#xff0c;算法会立即发出预警信号。Yolo算法采用一个单独…

数据结构初阶--排序

目录 一.排序的基本概念 1.1.什么是排序 1.2.排序算法的评价指标 1.3.排序的分类 二.插入排序 2.1.直接插入排序 2.2.希尔排序 三.选择排序 3.1.直接选择排序 3.2.堆排序 重建堆 建堆 排序 四.交换排序 4.1.冒泡排序 4.2.快速排序 快速排序的递归实现 法一&a…

Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 在看这篇帖子前&#xff0c;请先看我的另一篇帖子《Visual Studio 2022的MFC框架——应用程序向导》。 当程序调用了CWinApp类的构造…

Shell编程之运算符

目录 算数运算符 关系运算符 文件运算符 逻辑运算符 算数运算符 注意&#xff1a; 原生bash不支持简单的数学运算&#xff0c;但是可以通过其他命令来实现&#xff0c; 例如 expr 常用算数运算符 加-减*乘/除%取余 示例如下&#xff1a; A2 B3 expr $[$A$B] expr $[$A-$…