10.哀家要长脑子了!

1. 704. 二分查找 - 力扣(LeetCode)

哎哟 我去 我还以为你都搞懂了 呵呵

当时问题出现在右边界初始化

左闭右开 右边界是取不到的

int left = 0, right = nums.size() ;

while(left < right) {

        int mid = left + (right - left) / 2;

        if( target  > nums[mid]){

            left = mid + 1;

        }

        if( target < nums[mid]){

                right = mid;    

        }

        else 

                return mid;

}

左闭右闭 右边界可以取到

int left = 0, right = nums.size() - 1;

while(left <= right) {

        int mid = left + (right - left) / 2;

        if( target  > nums[mid]){

            left = mid + 1;

        }

        if( target < nums[mid]){

                right = mid - 1;    

        }

        else 

                return mid;

}

        

 2. 27. 移除元素 - 力扣(LeetCode)

 因为不能开辟新的空间,所以考虑用双指针,左指针的值等于val就跟右指针交换放到右边去,然后再把左指针往前移一位,右指针向前移动一位,继续寻找指向不等于val的元素。左指针的值不等于val就直接将左指针后移,右指针不需要移动。

本质:把val放在右边,不等于val的放在左边

int left = 0, right = nums.size() - 1;

for( int left = 0; left <= right; left++){

        if( nums[left] == val){

                swap(nums[left], nums[right]);

                left--, right--;

        }

}

        return ++right;

 因为最后右指针往前移所以返回的时候要加回来,要不然就少了不等于val的元素

左右元素交换后,右指针前移没问题。但是为什么左右元素交换后左指针还要向前移动一次呢?因为左指针等于val时可能右指针也等于val,此时左右元素交换后,左指针指向的值还是val,如果交换完直接将左指针后移那就出错辣,留下了val在左边;但是如果此时将左指针前移动,左指针指向的值不是val,右指针指向的值不是val,此时循环又将左指针往后移了,但是右指针的值不是val;这样就不会有遗漏的val在左边。总而言之,左右交换后,左指针再次前移是为了规避右指针所指向元素也为val时带来的影响。

3. 977. 有序数组的平方 - 力扣(LeetCode)

这道题可以直接用暴力,先都平方后然后再排序,但是会超时,不知道是不是因为我用的冒泡排序,私密马赛

巧妙的点在原数组是非递减、有正有负序列,也就是说数组平方后的最大元素不是在第一个就是在最后一个,你想想嘛!那么就可以用双指针,一个指针看左边一个指针看右边。如果左指针平方后的元素小于右指针平方后的元素,就先把左指针平方后的元素放入结果集,然后左指针向右移动;如果右指针平方后的元素小于左指针,就先把右指针平方后的元素放入结果集,然后右指针向左移动;知道左右指针相遇后可以结束循环。

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int l = nums.size() - 1;int i = 0;vector<int> res(nums.size(), 0);for(int i = 0, j = nums.size() - 1; i <= j;){if(nums[i] * nums[i] > nums[j] * nums[j]){res[l--] = nums[i] * nums[i];i++;}else{res[l--] = nums[j] * nums[j];j--;}}return res;}
};
4. 209. 长度最小的子数组 - 力扣(LeetCode)

这个题其实还挺有意思的

暴力做法:

两个for循环嵌套,其实也可以看成左右双指针咯,左指针(外循环)遍历起点,右指针(内循环)遍历终点(找到子数组总和大于等于target的)。 获取子数组长度,求数组元素总和,当子数字元素总和大于目标值的时候,我们就可以去寻找新的起点,看看有没有更短长度的子数组

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int res = INT32_MAX;int sum = 0, sub = 0;for(int i = 0; i < nums.size(); i++){sum = 0; // 每次得到一个新得子数组 总和初始位0for(int j = i; j < nums.size(); j++){sum += nums[j];if( sum >= target) {sub = j - i + 1;res = res < sub ? res : sub; // 取较小值break; // 已经得知这个子数组大于等于target了不用继续加元素了}}}return res = res == INT32_MAX ? 0 : res;}
};

力扣上暴力是过不了的,要用滑动窗口

滑动窗口:

暴力方法用两个for循环,滑动窗口用一个for循环里面嵌套while

关键的点是for循环遍历的是子数组的起点还是终点的,当然是终点辣~~ 要是是起点不又回到的暴力做法,嘻嘻。在for循环内遍历终点,求子数组元素总和,当总和大于等于目标值的时候,我们就求长度,然后后移起点,不断地去找新的起点(减掉第一个值)

我觉得有点像,for循环把所有的子数组都求出来,然后while循环操作子数组:挑选出满足条件的子数组然后在这些子数组中后移子数组的起点,看能不能找到长度更小的

class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int res = INT32_MAX;int i = 0, sum = 0, sub = 0;for(int j = 0; j < nums.size(); j++){sum += nums[j];while(sum >= target){sub = j - i + 1;res = res < sub ? res : sub;sum -= nums[i++]; //这里!!}}return res == INT32_MAX ? 0 : res;}
};

sum -= nums[i++];

更改起点:

-:去掉此时第一个元素参与 ++:下一个子数组起点 

5. 59. 螺旋矩阵 II - 力扣(LeetCode) 

没有什么算法含量,主要是模拟,考验对代码掌握的熟练程度

一开始懵懵懂懂晕头转向,现在看觉得挺巧妙挺有意思的

是这样一圈圈来的 是这样左闭右开的 最后的mid是这样的

                  

class Solution {
public:vector<vector<int>> generateMatrix(int n) {int loop = n / 2; //要转多少圈int mid = n / 2;  // 如果是奇数 最后的中间点单独操作int offset = 1;   // 每次转完一圈 边界往里面缩一圈int count = 1;    // 数值 元素int startx = 0, starty = 0; // 每一圈的起点   int i, j;    // 位置vector<vector<int>> res(n, vector<int>(n, 0));while(loop--){i = startx, j = starty;for(j; j < n - offset; j++){res[i][j] = count++;}for(i; i < n - offset; i++){res[i][j] = count++;}for(; j > startx; j--){res[i][j] = count++;}for(; i > starty; i--){res[i][j] = count++;}startx++, starty++, offset++;}    // 如果方阵是奇数行奇数列 剩下最中间那个单独赋值if(n % 2){res[mid][mid] = count;}return res;}
};

左闭右开左闭右开 坚持循环不变量(其实这句话我还不是很明白) 

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

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

相关文章

【随笔】Git 基础篇 -- 远程仓库 git clone(二十五)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

【复习笔记】FreeRTOS(六) 队列操作

本文是FreeRTOS复习笔记的第六节&#xff0c;队列操作。 上一篇文章&#xff1a; 【复习笔记】reeRTOS(四) 列表项的插入和删除 文章目录 1.队列操作1.1.队列操作过程1.2.队列操作常用的API函数 二、实验设计三、测试例程四、实验效果 1.队列操作 队列是为了任务与任务、任务与…

IP地址的主要功能及其在网络中的重要性

在当今数字化时代&#xff0c;互联网已经成为人们生活和工作中不可或缺的一部分。而IP地址&#xff08;Internet Protocol Address&#xff09;作为互联网中的关键组成部分&#xff0c;发挥着至关重要的作用。本文将探讨IP地址的主要功能以及其在网络中的重要性。 IP地址查询&…

Xcode 15.0 新 #Preview 预览让 SwiftUI 界面调试更加悠然自得

概览 从 Xcode 15 开始&#xff0c;苹果推出了新的 #Preview 宏预览机制&#xff0c;它无论从语法还是灵活性上都远远超过之前的预览方式。#Preview 不但可以实时预览 SwiftUI 视图&#xff0c;而且对 UIKit 的界面预览也是信手拈来。 想学习新 #Preview 预览的一些超实用调试…

【GEE实践应用】按照字段提取想要的研究区域

有的时候&#xff0c;我们在GEE中加载研究区域时&#xff0c;我们现有的矢量数据可能不止自己想要的研究区域的范围&#xff0c;这个时候&#xff0c;为了避免在ArcGIS中重新导出打包上传等操作&#xff0c;我们可以在GEE中按照字段进行选择我们想要的研究区域。下面是操作实例…

杰发科技AC7840——CAN通信简介(4)_过滤器设置

0. 简介 注意&#xff1a;过滤器最高三位用不到&#xff0c;因此最高位随意设置不影响过滤器。 1. 代码分析 注意设置过滤器数量 解释的有点看不懂 详细解释...也看不大懂 Mask的第0位是0&#xff0c;其他位都是1(就是F?)&#xff0c;那就指定了接收值就是这个数&#xff0c;…

ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token

前言 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络上以 JSON 对象的形式安全地传输信息。 JWT 通常用于在用户和服务器之间传递身份验证信息&#xff0c;以便在用户进行跨域访问时进行身份验证。 JWT 由…

matlab 安装 mingw64(6.3.0),OPENEXR

matlab安装openexr 1. matlab版本与对应的mingw版本选择2. mingw&#xff08;6.3.0&#xff09;下载地址&#xff1a;3. matlab2020a配置mingw&#xff08;6.3.0&#xff09;流程“4. matlab 安装openexr方法一&#xff1a;更新matlab版本方法二&#xff1a;其他博文方法方法三…

MySQL——链表

主键&#xff1a;非空 唯一&#xff08;针对整列数据而言&#xff09; 为了方便管理一般主键都是设置为自增 外键&#xff1a;一张表中的一列的值是另一张表的主键&#xff0c;使用外键建立两张数据表的数据关系 一、两张表连接 将两张表格拼接成一个表 1、格式&#xff1a;s…

爬虫 | 网易新闻热点数据的获取与保存

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目是一个简单的网络爬虫&#xff0c;用于从网易新闻的热点新闻列表中提取标题和对应的链接&#xff0c;并将提取到的数据保存到一个 CSV 文件中。 目录 一、技术栈 二、功能说明 三、注意事项 四、代码解析 1. 导入所需…

【C++进阶】RAII思想&智能指针

智能指针 一&#xff0c;为什么要用智能指针&#xff08;内存泄漏问题&#xff09;内存泄漏 二&#xff0c;智能指针的原理2.1 RAII思想2.2 C智能指针发展历史 三&#xff0c;更靠谱的shared_ptr3.1 引用计数3.2 循环引用3.3 定制删除器 四&#xff0c;总结 上一节我们在讲抛异…

PostgreSQL入门到实战-第二十九弹

PostgreSQL入门到实战 PostgreSQL中数据分组操作(四)官网地址PostgreSQL概述PostgreSQL中CUBE命令理论PostgreSQL中CUBE命令实战更新计划 PostgreSQL中数据分组操作(四) 如何使用PostgreSQL CUBE生成多个分组集 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不…

InternlM2

第一次作业 基础作业 进阶作业 1. hugging face下载 2. 部署 首先&#xff0c;从github上git clone仓库 https://github.com/InternLM/InternLM-XComposer.git然后里面的指引安装环境

【Golang学习笔记】从零开始搭建一个Web框架(二)

文章目录 模块化路由前缀树路由 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 模块化路由 路由在kilon.go文件中导致路由和引擎交织在一起&#xff0c;如果要实现路由功能的拓展增强&#xff0c;那将会非常麻烦&…

[尚硅谷flink] 检查点笔记

在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 文章目录 11.1 检查点11.1.1 检查点的保存1&#xff09;周期性的触发保存2&#xff09;保存的时间点3&#xff09;保存的具体流程 11.1.2 从检查点恢复状态11.1.3 检查点算法…

【python】 numpy 中常用随机数函数的使用和记忆(不易混淆)

文章目录 概述固定分布随机数&#xff08;只需指定形状的随机函数&#xff09;np.random.randomnp.random.randnp.random.randn 随机范围随机数&#xff08;需要指定范围和形状的随机函数&#xff09;np.random.randintnp.random.uniformnp.random.normalnp.random.poisson 代码…

乐写9612手写板实测故障

闲鱼上淘了二手的 ①需要驱动很强的usb口&#xff0c;老usb口会不识别&#xff0c;尤其是笔记本容易不识别&#xff0c;非常容易出现下面这种问题&#xff1a; ②需要microsoft2013以上的&#xff0c;兼容性做的比较差 ③由于可视化&#xff0c;导致数据线容易烧&#xff0c;…

超标量处理器设计:基于竞争的分支预测分支预测的更新

★ 继续学习体系结构的知识。 接着上一讲继续写 ★上一讲&#xff1a;超标量处理器设计&#xff1a;基于全局历史的分支预测-CSDN博客 ★上上一讲&#xff1a;超标量处理器设计&#xff1a;两位饱和计数器&基于局部历史的分支预测-CSDN博客 知识回顾&#xff1a; 基于局部…

策略模式【行为模式C++】

1.概述 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。 策略模式通常应用于需要多种算法进行操作的场景&#xff0c;如排序、搜索、数据压缩等。在这些情况下&#x…

将公式用MathType转换导入LaTex的方法 Mathtype+laTex 混合使用 在mathtype中打latex代码编辑公式

关于LaTex和Word之间孰优孰劣的争论已经持续了很长时间&#xff0c;有些朋友在写论文时还会纠结是用Word好还是用LaTex好&#xff0c;其实他们两也是各有优势&#xff0c;LaTeX 与 Word 是两种不同类型的文本编辑处理系统。Latex是无格式的明文文档&#xff0c;格式保存在源文件…