首页 > 其他分享 >02-JZ4 二维数组中的查找

02-JZ4 二维数组中的查找

时间:2023-10-04 16:05:03浏览次数:29  
标签:02 target nums int 查找 vector 数组 JZ4 size

我的

想法:

  1. 暴力:按行遍历,比较---O(m*n)
  2. 折半:行折半查找;有n行,折半n次---- O(nlgn)

问题:

不满足时间复杂度O(m+n)

正确

思路:

  1. 左下角开始比较
  2. arr[i][0]>target--往小找,往上走,i--;
  3. arr[i][0]<target--往大找,往右走,j++;
  4. arr[i][0]==target,即找到
  5. 循环截至条件,超出数组边界

适用场景:

迷宫遍历四周:因为行,列有序,会有方向的去遍历

代码

//1暴力方法
//题目:
/*
* 学习到:
* ------写代码
* 1. vector二维数组就像是一个元素为一维数组的数组:arr.size()是二维数组的行数,arr[0].size()是每行的元素个数
* 2. 将普通二维数组给vector容器赋值:matrix.push_back(a[i], a[i]+3);
* 3. vector成员函数push_back的使用,参数可以是值,也可以是迭代器
*/
#include <iostream>
using namespace std;
#include <vector>
//解决方法
class Solution1
{
public:
	//方法
	//返回目标值的有无,target是否在二维数组中
	bool find(vector<vector<int>> array, int target) {
		for (int i = 0; i < array.size(); i++) {
			if (array[i][0] > target) {
				break;
			}

			for (int j = 0; j < array[0].size(); j++) {
				if (array[i][j] == target) {
					return true;
				}
				else if (array[i][j] > target) {
					break;
				}
			}
		}
		return false;
	}

};
//没有返回值--打印二维数组
void printMatrix(const vector<vector<int>> matrix) {
	int m = matrix.size();
	int n = matrix[0].size();

	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cout << matrix[i][j] << " ";
		}
		cout << endl;
	}
}
//主函数
int main1()
{
	int a[][4] = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} };
	int target = 0;
	vector<vector<int>> nums;
	for (int i = 0; i < 4; i++) {
		nums.push_back(vector<int>(a[i], a[i] + 4));
	}

	//printMatrix(nums);
	
	Solution1 solution;

	cout << solution.find(nums, 14) << endl;

	return 0;
}
//分割线----------

//2折半法
//题目:
#include <iostream>
using namespace std;
#include <vector>
//解决方法
class Solution3
{
public:
	//方法
	bool find(int target, vector<vector<int>> nums) {
		for (int i = 0; i < nums.size(); i++) {
			int low = 0;
			int high = nums.size() - 1;
			while (low <= high) {
				int mid = (low + high) / 2;
				if (nums[i][mid] == target) {
					return true;
				}
				
				if (nums[i][mid] > target) {
					high = mid - 1;
					continue;
				}

				if (nums[i][mid] < target) {
					low = mid + 1;
					continue;
				}
			}
		}
		return false;
	}

};
//主函数
int main3()
{
	//测试
	int a[][4] = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} };	 //4*4
	int target = 7;		//目标值
	//创建vector二维数组容器
	vector<vector<int>> nums;
	//使用迭代器循环赋值
	for (int i = 0; i < 4; i++) {
		nums.push_back(vector<int>(a[i], a[i] + 4));
	}

	Solution3 solution;	//对象实例化

	cout << solution.find(target, nums) << endl;	//输出结果

	return 0;
}

//----分割线
//3. 数组O(m+n)遍历法
//题目:
/*
* 学习到:
* 代码------
* 1. 行,列数:rowCount, colCount
* 2. Solution类在全局区,多个文件相同类或函数会冲突
* 3. 代码调试,一定是自己错了,不要怀疑其他的。函数没执行,需要跳出本类的函数思维限制,去找其他的可能出现错误的地方
* 思路------
* 1. 先缕清执行一次的流程
* 2. 再思考循环,循环条件,变量维护
* 3. 再思考特殊情况
* 4. 再思考通用代码编写
*/
#include <iostream>
using namespace std;
#include <vector>
//解决方法
class Solution2
{
public:
	//方法
	//返回0or1,代表target是否在该数组中
	bool find(int target, vector<vector<int>> nums) {
		//行,列数
		int rowCount = nums.size();
		int colCount = nums[0].size();
		//cout << 2 << endl;
		//最初比较的元素下标值
		int i = rowCount - 1;
		int j = 0;
		//循环:元素与目标值大小
		while (i >= 0 && j < colCount) {
			if (nums[i][j] > target) {
				i--;
			}
			else if (nums[i][j] < target){
				j++;
			}
			else {
				return true;
			}
		}

		return false;
	}

};
//主函数
int main()
{
	//测试
	int a[][4] = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} };	 //4*4
	int target = 7;		//目标值
	//创建vector二维数组容器
	vector<vector<int>> nums;
	//使用迭代器循环赋值
	for (int i = 0; i < 4; i++) {
		nums.push_back(vector<int>(a[i], a[i] + 4));
	}

	Solution2 solution;	//对象实例化

	cout << solution.find(target, nums) << endl;	//输出结果

	return 0;
}



学习到

------写代码过程

  1. vector二维数组就像是一个元素为一维数组的数组:arr.size()是二维数组的行数,arr[0].size()是每行的元素个数
  2. 将普通二维数组给vector容器赋值:matrix.push_back(a[i], a[i]+3);
  3. vector成员函数push_back的使用,参数可以是值,也可以是迭代器
  4. 行,列数:rowCount, colCount

------调试过程

  1. 多文件编写时,全局区创建的几个类名,以及成员方法名相同,会造成主函数调用方法不确定是哪一个的问题----类名or成员方法名需要有区别
    Solution类在全局区,多个文件相同类或函数会冲突
  2. 调试需要静下心来去思考,然后再行动;需要精准察觉问题所在

-----——代码经验

  • 思路------
    1. 先缕清执行一次的流程
    1. 再思考循环,循环条件,变量维护
    1. 再思考特殊情况
    1. 再思考通用代码编写

标签:02,target,nums,int,查找,vector,数组,JZ4,size
From: https://www.cnblogs.com/97rong/p/17742317.html

相关文章

  • 2023-2024-1 20231319《计算机基础与程序设计》第1周学习总结
    《计算机基础与程序设计》第1周学习总结说明班级:2023-2024-1-计算机基础与程序设计作业要求:2023-2024-1《计算机基础与程序设计》教学进程作业目标:快速浏览一遍教材,并提出问题问题第一章1.信息隐藏是如何通过抽象实现的?2.云计算是如何脱离硬件而实现的,真的能完全脱离硬件......
  • 运维十年之久--2023国庆谈谈自己
    每次放假都做了相关的计划,坚持做到的只有其中一部分;在放假期间,总发现需要了解的东西太多,没有具体目标,在选择时候还是存在很多问题,没有找到目标和坚持要做的东西。2023年给自己定了很多的目标,也放弃了一些目标,还有一些目标没有实现,当务之急是准备PMP考试,其它目标后面在考虑,一个人......
  • 2023-2024-1学年 学号20231317 《计算机基础与程序设计》第二周学习总结
    学期(如2023-2024-1)学号(如:20231317)《计算机基础与程序设计》第二周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第二周作业)这个作业的目标<分别......
  • The 2021 ICPC 南京 ACJM
    The2021ICPCAsiaNanjingRegionalContest(XXIIOpenCup,GrandPrixofNanjing)A.Oops,It’sYesterdayTwiceMore思路:考虑先把所有袋鼠集中在一起然后再移动。因为有步数限制(\(\le3(n-1)\))。那么分类讨论移动到四个角上,看哪个符号条件的就输出。//AConemoreti......
  • 2022 CCPC 绵阳 M
    2022ChinaCollegiateProgrammingContest(CCPC)MianyangOnsiteM.Rock-Paper-ScissorsPyramid思路:这题推了好久,队友用递归写的。赛后我写这个题的时候,确实难推,用到了单调栈的思想。考虑对于一个\(P_{n-1}\)阶的三角形推出第\(P_{n}\)阶的三角形,考虑它的本质是什么?考虑当......
  • 2020 ICPC 南京 EFKL
    2020-2021ACM-ICPC,AsiaNanjingRegionalContest(XXIOpenCup,GrandPrixofNanjing)E.EvilCoordinate思路:因为如果给定了起点和初始走法,其实我们的终点是一定确定的。我们不妨让上下左右的连着一块走,那么对于\(RLUD\)一共有\(4!\)种走法(全排列),我们暴力枚举然后\(ch......
  • The 2022 ICPC 南京 ADG
    The2022ICPCAsiaNanjingRegionalContestA.Stop,YesterdayPleaseNoMore思路:因为袋鼠是同时移动的,所以我们可以不考虑袋鼠怎么动,而去考虑边界怎么动。所以我们先不考虑洞的影响,先确定哪些会因为边界而离开。确定好最终边界,再进行一次模拟,加入有洞的情况,发现洞产生的路径......
  • NOIP2022 比赛
    Day\(2^2+3^2+4^2\)。HNOI2016序列的加强版。我去年怎么这么菜啊,虽然现在也是就是了。\[\sum\limits_{[l,r]\in[L,R]}\left(\max\limits_{i\in[l,r]}a_i\right)\left(\max\limits_{i\in[l,r]}b_i\right)\]考虑离线,对右端点\(r\)扫描线,对每个左端点\(l\)维护\(S_l=\le......
  • comsol下载-2023全新绿色中文版下载 安装包下载方式
    COMSOL6.0版全称叫做COMSOLMultiphysics,是一款闻名全球的多功能物理仿真软件,这款软件通常被应用于工程、制造、科研等各个方面,相关用户在这里可以进行设计绘图、仿真建模、数据分析等一系列操作,从而可以很好的提升了相关用户的工作效率。另外,该软件还采用了可视化的操作界面,使得用......
  • caxa软件2021下载安装包 安装包下载方式
    CAXA2019电子图板是一款专门给设计工程师们所打造的二维CAD设计软件,该软件类似于AutoCAD这些软件,都是可以用作室内设计。软件不仅仅具有完全的自主知识产权,而且还拥有了超过二十多万的企业用户成功应用,非常稳定可靠,它是百万工程师必备的CAD软件。除此之外,这款软件功能非常强大,不仅......