共计 2242 个字符,预计需要花费 6 分钟才能阅读完成。
背景
通过面试才晓得算法的重要性,无论是社招还是校招,所有大厂都很重视对于算法能力的考查,所以算法几乎就是居家旅行升职加薪的必备技能。而且抛去这些功利的想法,算法的确能够锤炼咱们的逻辑思维和形象的能力,这也是程序猿的根本素养。所以我也想专门开一个专栏记录本人的刷题之路,尽可能深刻的分析问题,了解不同的解题思路,而且我也始终在谋求技术的全面性而不是囿于挪动开发一个畛域,所以也会尽可能应用不同的语言,在实践中去领悟不同语言的个性。最初还有一点就是心愿找一件事件始终坚持下去,通过多年我发现坚持不懈才是这个世界上最难能可贵的品质,一个人的工夫是无限的,一个好的习惯能够让咱们戒掉一个坏的习惯。
这次刷题会对题目进行分类总结,即会依据数据结构数组、链表和树等归类,也会依据算法如分治法和动静布局等进行总结,题目次要来源于 leetcode。
题目
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。你能够假如每种输出只会对应一个答案。然而,数组中同一个元素在答案里不能反复呈现。
示例
输出:nums = [2,7,11,15], target = 9
输入:[0,1]
解释:因为 nums[0] + nums[1] == 9,返回 [0, 1]。
输出:nums = [3,2,4], target = 6
输入:[1,2]
输出:nums = [3,3], target = 6
输入:[0,1]
解题思路
暴力枚举
这是一道数组简略题,没有太多简单的算法,次要考查对于根本的数组操作,最先想到的能够通过两次枚举来寻找适合的对象,而且第二次枚举能够从第一次枚举开始的下一项开始。
JAVA
class Solution {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) {return new int[]{i, j};
}
}
}
return new int[0];
}
}
Python3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(0, len(nums)):
for j in range(0, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []
C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {int size = nums.size();
for (int i = 0; i < size; ++i) {for (int j = i + 1; j < size; j++) {if (nums[i] + nums[j] == target) {return {i, j};
}
}
}
return {};}
};
哈希表
下面暴力枚举的办法尽管能够解决问题,然而因为须要两次遍历工夫复杂度较高,能够引入哈希表在就义肯定空间的前提下升高工夫复杂度。遍历时先判断哈希表中是否有 target – nums[i], 如果有就返回后果,如果没有则将数组值作为 Key,数组索引作为 Value 存入哈希表。这里拿数组值作为 Key 可能会有抵触,然而这不影响最终后果。例如数组[2, 2, 1], 目标值为 3,最初返回后果为[1, 2],因为雷同的数组值只会在遍历时更新哈希表对应的 Key 的 Value,而判断条件是通过 Key,所以不会影响。
JAVA
class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer, Integer> hashtable = new HashMap<>();
for (int i = 0; i < nums.length; i++) {if (hashtable.containsKey(target - nums[i])) {return new int[]{hashtable.get(target - nums[i]), i};
} else {hashtable.put(nums[i], i);
}
}
return new int[0];
}
}
Pyhton3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = {}
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[num] = i
return []
C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); i++) {auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};}
};
最初
有趣味能够关注公众号 QStack,会不定期发一些文章和学习资源。