概述: 这系列文章并不是给出很厉害的解决问题的方法,大多是自己再解决问题上的一些思考,以及涉及的知识点。
1.对于每道题,要有一个思考的过程 需求分析:要得到两个数相加为目标值的索引
拟定的解决方法:
(1) 穷举法:把所有可能的情况都列出来
特殊情况有哪些:可能没有符合条件的;
数据的边界范围:因为数组作为参数传入,所以不用考虑设置一个数组了,这里和Acwing不太一样
[为了方便观看,我将代码放在思路这里]
class Solution {
#define MAX 10005
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size();
for(int i = 0; i < len; i++ ){
for(int j = i + 1; j < len; j++){
if(nums[i] + nums[j] == target){
return {i ,j};
}
}
}
return {};
}
};
(2)参考答案了解到的高效解决方案: 哈希表法:哈希也叫散列,体现的是存储的值与索引之间是一种对应的关系,这种关系通过采用特别的方法来建立
那
么
要
怎
么
应
用
哈
希
表
呢
?
以
及
如
何
应
用
呢
?
(
给
出
了
单
独
的
版
块
)
/
\color{pink}{那么要怎么应用哈希表呢?以及如何应用呢?(给出了单独的版块)}/
那么要怎么应用哈希表呢?以及如何应用呢?(给出了单独的版块)/
class Solution {
#define MAX 10005
public:
vector<int> twoSum(vector<int>& nums, int target) {
int len = nums.size();
unordered_map<int, int> countNum;
for(int i = 0; i < len; i++){
if(countNum.find(target - nums[i]) != countNum.end()){
return {i, countNum.find(target - nums[i]) -> second};
}
countNum[nums[i]] = i;
}
return {};
}
};
对于解决问题过程中存在的问题:
(1)输出的是一个数组,那么这个return 的是什么呢 (2)我将用什么来保存这个找到的值呢 我想过用数组保存,但是当满足条件的值出现时,会有两个索引,不能同时保存两个索引
查询的问题:
如何返回一个数组: 不能直接返回数组,通过指针操作来完成
参考答案获得的知识:
(1)对于索引的返回并不用保存,直接添加大括号即可 return {i, j} (2)针对于没有满足条件的答案,通过返回 空的大括号来完成 return {} (3)题目中有一个细节问题没有捕捉到:“数组中找出和为目标值的那两个整数” ——》 高亮部分需要注意
重点来了——哈希板块
1.对于哈希表我们的确学过,但是只是基于理论层面的,学校并没有教给我们怎么去使用。 2.针对当前这题,对于涉及的方法与思想都让我来好好学习一下吧?
(1)unordered_map<key, value> Map_name
此处的key和value填的都是对应的数据类型,通过这条语句可以完成哈希表的创建
(2)map.find(num)
用find函数定位num出现的位置,如果出现了,就会返回数据出现位置的迭代器;如果没出现,返回的迭代器就会等于end函数返回的迭代器
(3)map.end()
这个函数返回的也是一个迭代器,不过返回的是最后一个映射旁边的迭代器,一般与find函数组合使用,代表哈希表中不存在这样的数据
(4)有一个很重要的问题:
最开始哈希表里面是没有数据的,第一次利用find函数进行查找时,返回的迭代器一定为map.end()返回的迭代器,因为找到的两个数的和,此时就以1,3为例,找 4 -1 时,没有找到三,就要吧1保存到哈希表中,当找 4 - 3时,找到了一,所以就解决了问题
【因为XiaoZhao是主Java的为了更好的学习,在文章末尾添加Java的代码】
暴力枚举法
[因为C++和Java之间是存在一定差异的,所以我再给出不同部分替换方法的解释]
- 对于返回一个空/非空的数组时(原来未定义),是要new一个数组的
- new int [] {ba,la} 这里面的ba la 就是这个数组的内容
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
for(int i = 0; i < len; i++){
for(int j = i + 1; j < len; j++){
if(nums[i] + nums[j] == target){
return new int[]{i, j};
}
}
}
return new int[0];
}
}
哈希表
- 创建哈希表的方式不同:Map<keytype,valuetype> mapname = new HashMap<keytype,valuetype>();
- 对于查看哈希表中是否包含这个key的方式不同:
map.containsKey( ) - 获取value的方式不同: map.get(key)
class Solution {
public int[] twoSum(int[] nums, int target) {
int len = nums.length;
Map <Integer, Integer> countNum = new HashMap<Integer, Integer>();
for(int i = 0; i < len; i++){
if(countNum.containsKey(target - nums[i])){
return new int[]{i, countNum.get(target - nums[i])};
}
countNum.put(nums[i], i);
}
return new int[0];
}
}
|