C++刷题篇——04找等值元素

一、题目

二、解题思路

1、分割后放进二维数组

2、使用map,key为数值,value为其坐标

3、遍历二维数组元素,再在map中找该元素对应的value值(二维数组形式),倘若value.size为1,那直接返回-1,否则继续遍历value(二维数组),将值减去当前i,j坐标后不断比较取出最小值放进数组,放进的位置正好就是该元素对应的i,j位置

三、代码

cpp 复制代码
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>

using namespace std;

vector<int>split(string params) {
	vector<int>p;
	while (params.find(" ") != string::npos) {
		int found = params.find(" ");
		p.push_back(stoi(params.substr(0, found)));
		params = params.substr(found + 1);
	}
	p.push_back(stoi(params));
	return p;
}

int main() {
	string m_str;
	getline(cin, m_str);
	int m = stoi(m_str); //m行

	string n_str;
	getline(cin, n_str);
	int n = stoi(n_str); //n列

	vector<int>temp;
	vector<vector<int>>temps;
	for (int i = 0; i < m; i++) {
		string num;
		getline(cin, num);
		temp = split(num);
		temps.push_back(temp);
		temp.clear();
	}

	//key为数值,value为该值的坐标
	map<int, vector<vector<int>>>num_map;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			vector<int>sit;
			sit.push_back(i);
			sit.push_back(j);
			num_map[temps[i][j]].push_back(sit);
			sit.clear();
		}
	}

	vector<int>res;
	vector<vector<int>>result;
	for (int i = 0; i < m; i++) { //注意此刻是遍历二维数组元素,因为便于后面减去i,j坐标后直接放进数组,放进的位置正好就是该元素对应的位置
		for (int j = 0; j < n; j++) {
			if (num_map[temps[i][j]].size() == 1) { //依次遍历二维数组key,如果其对应的value仅有一个元素,返回-1
				res.push_back(-1);
			}
			else {
				int min_distance = INT_MAX; //不确定最小值比多少少,这里就先给一个最大值,最小值的写法:INT_MIN
				for (int k = 0; k < num_map[temps[i][j]].size(); k++) {
					int distance = abs(num_map[temps[i][j]][k][0] - i) + abs(num_map[temps[i][j]][k][1] - j); //当前元素坐标就为i,j,所以直接遍历坐标相减即可
					if (distance == 0) { //排除坐标等于自己的情况
						continue;
					}
					min_distance = min(min_distance, distance);
				}
				res.push_back(min_distance); //由于依次遍历i,j,所以放进的位置也是按照顺序的
			}
		}
		result.push_back(res); //遍历完每一行后,放进二维数组
		res.clear(); //及时清空一维数组
	}

	string r = "";
	for (auto x : result) {
		for (auto y : x) {
			r += to_string(y) + ",";
		}
		r = r.substr(0, r.size() - 1) + "],[";
	}
	r = "[[" + r.substr(0, r.size() - 2) + "]";
	cout << r << endl;
	return 0;
}
相关推荐
江奖蒋犟4 分钟前
【初阶数据结构】排序——归并排序
c语言·数据结构·算法
落雨便归尘6 分钟前
c++进阶篇——初窥多线程(四) 线程同步的概念以及锁
c++·笔记·学习
无限大.13 分钟前
c语言实例 -- 循环链表
c语言·开发语言·链表
cdut_suye14 分钟前
STL之list篇(下)(从底层分析实现list容器,逐步剥开list的外表)
开发语言·数据结构·c++·学习·算法·stl·list
大地之灯16 分钟前
深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)
人工智能·python·深度学习·学习·算法
Stark、16 分钟前
异常处理【C++提升】(基本思想,重要概念,异常处理的函数机制、异常机制,栈解旋......你想要的全都有)
c语言·开发语言·c++·后端·异常处理
流星白龙35 分钟前
【C++算法】9.双指针_四数之和
开发语言·c++·算法
闻缺陷则喜何志丹36 分钟前
【C++差分数组】2381. 字母移位 II|1793
c++·算法·字符串·力扣·差分数组·移位·方向
李余博睿(新疆)36 分钟前
c++知识点总结
c++
什么鬼昵称37 分钟前
Pikachu-PHP反序列化
开发语言·javascript·php