前言
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、题目
如何生成可参考右边的帮助文档给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
二、使用步骤
1.自己写的
代码如下(示例):
public int[] twoSum(int[] nums,int target){
for (int i = 0; i < nums.length; i++) {
for (int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
int[] k = {
i,j};
return k;
}
}
}
return nums;
}
2.别人写的
代码如下(示例):
public int[] twoSum2(int[] nums,int target){
int[] indexs = new int[2];
// 建立k-v ,一一对应的哈希表
HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();
for(int i = 0; i < nums.length; i++){
if(hash.containsKey(nums[i])){
indexs[0] = i;
indexs[1] = hash.get(nums[i]);
return indexs;
}
// 将数据存入 key为补数 ,value为下标
hash.put(target-nums[i],i);
}
return indexs;
}
这种方法肯定是更优的,它只用了一个for循环,用hashmap来替代了另外一个for循环
两个紧挨着的数字相比较就有个先后的问题,如果不考虑先后的话会导致自己和自己比较,这里的if比较就是相当于hash滞后了一步,该题的hash.put的位置也很关键,放在后面位置的话就是比较在前,放置函数在后,用旧的hash和新的nums[i]来作比较,永远是前一个和后一个比较,牛的。
总结
我觉得本质是对于要将一个数组遍历两遍的时候,可以看是否有这样的机会用目标减掉一个数,然后继续遍历你的数组,表面上只是减少了一次,但其实是次方的差距。