关于算法:每日算法之数组一

41次阅读

共计 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,会不定期发一些文章和学习资源。

正文完
 0