《剑指offer》

本专题是分享剑指offer的一些题目,开始刷题计划。

二维数组的中的查找【https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&ru=/exam/oj】

描述

在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

[

[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]

]

给定 target = 7,返回 true。

给定 target = 3,返回 false。

数据范围:矩阵的长宽满足 0≤�,�≤5000≤n,m≤500 , 矩阵中的值满足 0≤���≤1090≤val≤109
进阶:空间复杂度 �(1)O(1) ,时间复杂度 �(�+�)O(n+m)

示例1

输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]

返回值  true

说明:存在7,返回true

示例2

输入:1,[[2]]

返回值 false

就是一个从右上角进行查找就可以了,当然也可以从左下角进行查找,这两个操作都是可以的。

代码:

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param target int整型 * @param array int整型vector<vector<>> * @return bool布尔型*/bool Find(int target, vector<vector<int> >& array) {// write code hereint i = 0;int j = array[0].size() - 1;while(i<array.size() && j>=0){if(array[i][j] == target){return true;}else if(array[i][j] > target){j--;}else {i++;}}return false;}
};

旋转数字的最小和https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159&ru=/exam/oj

描述

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。

数据范围:1≤�≤100001≤n≤10000,数组中任意元素的值: 0≤���≤100000≤val≤10000

要求:空间复杂度:�(1)O(1) ,时间复杂度:�(����)O(logn)

 

这类题目我们对此有三种解法,但是因为解题的效率是不同的,第一种解法就是暴力求解,遍历一遍数组,然后找出最小值,这样的时间复杂度是O(N)。

解法一

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint i = 0;int n = nums.size();int ret = nums[0];while(i < n){if(ret > nums[i]){ret = nums[i];}i++;}return ret;}
};

虽然这种做法是能通过的,但是不符合我们对题目的要求,题目是要求一个O(logN)的写法,这个是不满足的,解法二是一个类似双指针的做法

解法二

双指针

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param nums int整型vector* @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint left = 0;int right = 1;int n = nums.size();while(right < n){if(nums[left] > nums[right]){return nums[right];}right++;left++;}if(nums[0] < nums[n - 1]){return nums[0];}return 0;}
};

 但是这个是存在随机性的,因为最坏的情况的时候,时间复杂度还是O(N),所以这题的解法如果要达到O(logN)就是一个二分查找,这里分享两种写法。

二分查找

写法一

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint left = 0;int right = nums.size() - 1;int mid = 0;if(nums[left] < nums[right]){return nums[left];}while(left < right){if(right - left == 1){mid = right;break;}mid = left + (right - left ) / 2;if(nums[mid] == nums[left] && nums[right] == nums[mid]){int ret = nums[left];for(int i = left + 1; i < right; i++){if(ret > nums[i]){ret = nums[i];}}return ret;}if(nums[mid] >= nums[left]){left = mid;}else  {right = mid;}}return nums[mid];}
};

 但是这个其实感觉也不完全是一个二分查找,因为如果数据全部是一样的时候就不是一个完整的二分查找了,但是如果数据不同的时候就是一个完整的二分查找了。

解法二

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint left = 0;int right = nums.size() - 1;while(left < right){if(nums[left] < nums[right]){return nums[left];}int mid = left + (right - left) / 2;if(nums[mid] > nums[right]){left = mid+1;}else if(nums[mid] < nums[right]){right = mid;}else  {right--;//或者写成left++目的其实就是排除一些相同的数字}}return nums[left];}
};

 本人推荐解法二,这个比较是符合二分查找的,但是其实二分查找是有一些模板的,后面会在算法专题更新模板。

调整奇数位置到偶数位置之前

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路一其实就是可以用双指针的方法,就是从左边和右边一并开始,然后遇到左边找奇数,右边找偶数,进行交换就行了。

思路2

找到奇数然后进行保存,将偶数位置整体往后移动,移动的时候需要注意的一点就是我们之前调整过的奇数是不需要进行调整的,而且调整的位置是当前的奇数开始往前调的。

代码

public class Solution {public void reOrderArray(int [] array) {//相对位置不变,稳定性//插入排序的思想int m = array.length;int k = 0;//记录已经摆好位置的奇数的个数for (int i = 0; i < m; i++) {if (array[i] % 2 == 1) {int j = i;while (j > k) {//j >= k+1int tmp = array[j];array[j] = array[j-1];array[j-1] = tmp;j--;}k++;}}}
}

三题分享完毕,明天继续。

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

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

相关文章

大端和小端传输字节完整版

大端和小端传输字节序 大端和小端一、最高有效位、最低有效位1.MSB(Most significant Bit)最高有效位2.LSB(Least Significant Bit)最低有效位 二、内存地址三、大端和小端四、网络字节序和主机字节序五、C#位操作符六、C#中关于大端和小端的转换七、关于负数八、关于汉字编码以…

论文阅读 - Non-Local Spatial Propagation Network for Depth Completion

文章目录 1 概述2 模型说明2.1 局部SPN2.2 非局部SPN2.3 结合置信度的亲和力学习2.3.1 传统正则化2.3.2 置信度引导的affinity正则化 3 效果3.1 NYU Depth V23.2 KITTI Depth Completion 参考资料 1 概述 本文提出了一种非局部的空间传播网络用于深度图补全&#xff0c;简称为…

边缘计算:重塑数字世界的未来

引言 随着物联网&#xff08;IoT&#xff09;设备的激增和5G网络的普及&#xff0c;我们正站在一个计算模式的新纪元门槛上——边缘计算。这一技术范式将数据处理和分析推向网络的边缘&#xff0c;即设备或终端&#xff0c;为实时性要求较高的应用提供了前所未有的可能性。 目…

【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL

本文项目编号&#xff1a; T 002 。 \color{red}{本文项目编号&#xff1a;T002。} 本文项目编号&#xff1a;T002。 目录 1 功能模块1.1 在线交流模块1.2宿舍分配模块1.3 校园概况模块1.4 专业管理模块 2 系统展示3 核心代码3.1 图表展示3.2 查询评论3.3 新增报道 4 免责声明 …

2024春节联欢晚会刘谦魔术分析

春晚已经越来越拉胯了&#xff0c;看着节目单没一个能打的&#xff0c;本来想说&#xff1a;办不起&#xff0c;就别办呗。 没想到第二天刘谦的魔术以一种很奇特的姿势火起来了&#xff0c;干脆蹭个热度&#xff0c;分析下魔术的原理。 魔术1 这个不算什么新奇的节目&#xf…

春晚后台撒贝宁意外“踩高跷”,尼格买提内增高秘密笑翻全场。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 龙年春晚无疑是观众们热议的焦点&#xff01;除了尼格买提表演…

Spring Task定时任务

目录 1、介绍 2、cron表达式 2.1、在线生成器 2.2、通配符 3、代码示例 3.1、使用步骤 3.2、 代码开发 3.3、测试 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发…

windows vs 自己编译源码 leveldb 然后使用自己编译的文件

1 准备源码文件 1.1 第一种方法 git下载源码 vs项目中git leveldb源码和git third_party googletest-CSDN博客 1.2 第二种方法 手动下载 然后把第三方的源码下载 复制到 third_party 对应的文件夹中 没有文件夹 third_party -> powershell mkdir third_party 2 编译lev…

数据库第二次实验

目录 1 实验内容 2 SQL代码及运行截图 2.1 创建表并插入数据 2.1.1 创建表 2.1.2 插入数据 2.1.3 运行截图 2.2 修改表 2.2.1 SQL代码 2.2.2 运行截图 2.3 删除操作 2.3.1 SQL代码 2.3.2 运行截图 2.4 数据库的备份 2.5 数据库的恢复 1 实验内容 实验目的&#…

SG3225EEN晶体振荡器规格书

SG3225EEN 晶振是EPSON/爱普生的一款额定频率25 MHz至500 MHz的石英晶体振荡器&#xff0c;6脚贴片&#xff0c;LV-PECL输出&#xff0c;3225封装常规有源晶振&#xff0c;具有小尺寸&#xff0c;轻薄型&#xff0c;高稳定性&#xff0c;低相位抖动&#xff0c;低电源电压&…

零基础怎么学编程,免费版中文编程工具下载及构件用法教程

零基础怎么学编程&#xff0c;免费版中文编程工具下载及构件用法教程 一、前言 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ 编程工具及实例源码文件下载可以点击最下方官网…

如何给最小化安装的CentOS主机装个远程桌面?

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们领微软云Azure的免费主机时&#xff08;白嫖党618福利&#xff01;来Azure领200美刀&#xff01;外加云主机免费用一年&#xff01;&#xff09;&#xff0c;发现“有资格免费试用服务”的主…

飞天使-k8s知识点19-kubernetes实操4-资源调度 标签和选择器:Label与Selector的使用-版本回退

文章目录 添加label资源调度 Deployment&#xff1a;创建与配置文件解析rs pod deploy 的关联信息展示Deployment&#xff1a;滚动更新Deployment&#xff1a;回滚回退版本实际操作 添加label [rootkubeadm-master1 test]# kubectl get pod NAME …

鸿蒙开发系列教程(二十一)--轮播处理

轮播处理 Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示 在自身尺寸属性未被设置时&#xff0c;会自动根据子组件的大小设置自身的尺寸 参数&#xff1a; 通过loop属性控制是否循环播放&#xff0c;该属性默认值为tr…

Recovering a Small String-Codeforces

题目链接&#xff1a;Problem - A - Codeforces 解题思路&#xff1a;分三种情况 第一个字母a,最后一个字母z 前两个字母a 最后两个字母z 其他根据大小算出剩下的字母 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int t, n;cin…

算法刷题:四数之和

四数之和 .题目链接题目详情算法原理我的答案 . 题目链接 四数之和 题目详情 算法原理 题目要求的是abctarget 这道题我们可以参考一下三数之和 三数之和中,我们固定的是其中一个数,四数之和中,我们则需要固定两个数 即 abctarget的时候固定d,找到abctarget-d 在求abctarget…

学法减分线上考试答案查找?分享九个搜题直接出答案的软件 #媒体#媒体#笔记

在信息爆炸的时代&#xff0c;选择适合自己的学习辅助工具和资料&#xff0c;能够提供更高效、便捷和多样化的学习方式。 1.试题猪 这是个微信公众号 一款聚合了好多款搜题软件的公众号&#xff0c;对话框可以直接搜题&#xff0c;题库好像挺多的&#xff0c;一次性能出好多…

Linux系统入门

目录 探索命令行 学习使用 man 寻找帮助 控制字符 统计代码行数 统计磁盘使用情况 在Linux下编写 Hello World 程序 使用重定向 使用Makefile管理工程 Unix哲学 探索命令行 Linux命令行中的命令使用格式都是相同的: 命令名称 参数1 参数2 参数3 ... 参数之间用任意…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-动态内存

目录 一、动态内存运行机制二、动态内存开发流程三、动态内存使用说明四、动态内存核心算法五、动态内存接口六、代码分析&#xff08;待续...&#xff09;坚持就有收获 一、动态内存运行机制 动态内存管理&#xff0c;即在内存资源充足的情况下&#xff0c;根据用户需求&…

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…