背景
通过面试才晓得算法的重要性,无论是社招还是校招,所有大厂都很重视对于算法能力的考查,所以算法几乎就是居家旅行升职加薪的必备技能。而且抛去这些功利的想法,算法的确能够锤炼咱们的逻辑思维和形象的能力,这也是程序猿的根本素养。所以我也想专门开一个专栏记录本人的刷题之路,尽可能深刻的分析问题,了解不同的解题思路,而且我也始终在谋求技术的全面性而不是囿于挪动开发一个畛域,所以也会尽可能应用不同的语言,在实践中去领悟不同语言的个性。最初还有一点就是心愿找一件事件始终坚持下去,通过多年我发现坚持不懈才是这个世界上最难能可贵的品质,一个人的工夫是无限的,一个好的习惯能够让咱们戒掉一个坏的习惯。
这次刷题会对题目进行分类总结,即会依据数据结构数组、链表和树等归类,也会依据算法如分治法和动静布局等进行总结,题目次要来源于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,会不定期发一些文章和学习资源。