《剑指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.hqwc.cn/news/471132.html

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

相关文章

关于Django的中间件使用说明。

目录 1.中间件2. 为什么要中间件&#xff1f;3. 具体使用中间件3.1 中间件所在的位置&#xff1a;在django的settings.py里面的MIDDLEWARE。3.2 中间件的创建3.3 中间件的使用 4. 展示成果 1.中间件 中间件的大概解释&#xff1a;在浏览器在请求服务器的时候&#xff0c;首先要…

【JAVA-Day88】Java字符串和JSON对象的转换

Java字符串和JSON对象的转换 Java字符串和JSON对象的转换摘要引言一、什么是JSON二、JSON的应用场景三、JSON对象转字符串3.1 使用 Jackson 库实现 JSON 对象转字符串3.2 使用 Gson 库实现 JSON 对象转字符串 四、JSON字符串转对象4.1 使用 Jackson 库实现 JSON 字符串转对象4.…

Editing While Playing 使用 Easyx 开发的 RPG 地图编辑器 tilemap eaitor

AWSD移动画布 鼠标右键长按拖拽 鼠标左键长按绘制 可以边拖拽边移动画布边绘制。 F1 导出 DLC F2 导入DLC author: 民用级脑的研发记录 1309602336qq.com 开发环境&#xff1a; 内置 easyx 的 devc 5.11 或者 VS 2022 TDM GCC 4.9.2 64-bit c11及以上都可运行 windows 环境运行…

通过深度学习和人脸图像进行年龄段估计matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1深度学习网络 4.2 人脸特征提取 4.3 回归模型构建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ..................................…

平时积累的FPGA知识点(8)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第八期&#xff1a; 21 FFT IP核 有遇到过FFT IP核测量频率不准确的问题吗&#xff1f;大部分情况下都是准的&#xff0c;偶尔偏差比较大&#xff0c;IP核输入的数据用matlab计算出的频率是对的。 解释&#xff1a;可能是采样点…

docker (三)-开箱即用常用命令

一 docker架构 拉取镜像仓库中的镜像到本地&#xff0c;镜像运行产生一个容器 registry 镜像仓库 registry可以理解为镜像仓库&#xff0c;用于保存docker image。 Docker Hub 是docker官方的镜像仓库&#xff0c;docker命令默认从docker hub中拉取镜像。我们也可以搭建自己…

数据结构——6.1 图的基本概念

第六章 图 6.1 图的基本概念 概念 图的概念&#xff1a;G由点集V和边集E构成&#xff0c;记为G(V,E)&#xff0c;边集可以为空&#xff0c;但是点集不能为空 注意&#xff1a;线性表可以是空表&#xff0c;树可以是空树&#xff0c;但图不可以是空&#xff0c;即V一定是非空集…

Pr教程1-8节笔记

第一课 认识PR以及PR的学习方法 学习任务&#xff1a; 1、熟练掌握PR软件&#xff0c;同时掌握剪辑技术以及常用于制作特效的效果器。 2、认识PR软件的名称、主要功能以及用途作用。 3、明白学习PR我们能做些什么以及PR的学习方法。 知识内容&#xff1a; 1、PR是专门用于视…

Linux 基础/子目录分配/文件路径

在Linux系统中&#xff0c;整个系统只具有一个根目录“/”&#xff0c;用斜杠表示。根目录是整个文件系统的顶层目录&#xff0c;在他下面可以创建其他的目录和文件。 Linux中的子目录分配&#xff1a; /bin - 基本命令的二进制文件&#xff0c;这些命令可供所有用户使用&am…

(10)Hive的相关概念——文件格式和数据压缩

目录 一、文件格式 1.1 列式存储和行式存储 1.1.1 行存储的特点 1.1.2 列存储的特点 1.2 TextFile 1.3 SequenceFile 1.4 Parquet 1.5 ORC 二、数据压缩 2.1 数据压缩-概述 2.1.1 压缩的优点 2.1.2 压缩的缺点 2.2 Hive中压缩配置 2.2.1 开启Map输出阶段压缩&…

详解 Redis 实现数据去重

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ &#x1f388;&#x1f388;希望这篇博客对大家能有帮助&#x1f388;&#x1f388; 目录 言 一. Redis去重原理 1. Redis Set 数据结构 2. 基于 Set 实现数据去重 3. 代码示例 4. 总结 …

【正点原子STM32】TIMER 定时器(软件定时原理、定时器定时原理、分类和特性、基本定时器(影子寄存器和U事件和UI中断))

一、定时器概述 1.1、软件定时原理1.2、定时器定时原理1.3、STM32定时器分类1.4、STM32定时器特性表1.5、STM32基本、通用、高级定时器的功能整体区别 二、基本定时器 2.1、基本定时器简介2.2、基本定时器框图2.3、定时器计数模式及溢出条件2.4、定时器中断实验相关寄存器2.…