【算法攻坚】算法刷题开篇

简介: 单词表中的abandon万事开头难,现在就从单词第一个入手,这道本身也不难,所以就从他开始了two sum

题目


给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。


你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。


示例


示例 1:


输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。


示例 2:


输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3:

输入:nums = [3,3], target = 6 输出:[0,1]


思路


最直接的方案当然就是两层for循环,这种算法复杂度为O(n*n),为了找手写算法的感觉同时摆脱IDE工具的已阿莱,还是从这个循环开始写


实现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) {
                return new int[]{i, j};
            }
        }
    }
    return new int[0];
}
提交结果  执行用时  内存消耗
通过       56 ms      38.7 MB 

朴实无华,清晰易懂,但是面试题这么做可能就直接回家了


实现2


实现1中的缺点表现在算法负责度高,而且这么高不是必须的

一次循环其实就已经把需要的值都找出来了,第二遍循环是多余的

所以接下来就是通过一遍循环找到答案,


比较直接能够想到的是循环的过程中把已经遍历过的数据存储在hash中


public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> data = new HashMap<>(nums.length);
    for (int i = 0; i < nums.length; i++) {
        int t = target - nums[i];
        if (data.containsKey(t)) {
            return new int[]{data.get(t), i};
        } else {
            data.put(nums[i], i);
        }
    }
    return new int[0];
}
提交结果  执行用时  内存消耗
通过       2 ms     38.1 MB 

这种实现利用了Hash获取元素算法复杂度为O(1)

这样就可以通过一遍循环找到符合条件的元素


举一反三


这道题给我感受是,合理的利用数据结构的特点可以大大降低算法复杂度,提升处理效率

包括在实际开发中,数据结构的选用也是非常重要

例如在业务中,

输入->输出

0->0

1->1,

2->1,

3->2,

4->3,

5->5


这时就可以通过存储对应关系,也就是常说的表驱动方式实现业务


private static final int[] data = {0, 1, 1, 2, 3, 5};
public int getResult(int n) {
    if (n < 0 || n > data.length) {
        return -1;
    }
    return data[n];
}

万事开头难,加油~我对自己说


今天多学一点,明天少求人一次


目录
相关文章
|
6月前
|
机器学习/深度学习 存储 算法
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
【算法沉淀】刷题笔记:并查集 带权并查集+实战讲解
|
6月前
|
自然语言处理 算法
算法刷题(二十三):Bigram 分词
算法刷题(二十三):Bigram 分词
68 0
|
6月前
|
算法
算法刷题(二十二):宝石与石头
算法刷题(二十二):宝石与石头
67 0
|
5月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
1月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
14 0
|
3月前
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
|
3月前
|
算法 Python
【Leetcode刷题Python】改进的算法,高效求一个数的因子
一个高效的Python函数用于找出一个整数的所有因子,通过仅遍历到该数平方根的范围来优化性能。
42 0
|
5月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-2
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
5月前
|
算法 C++
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题-1
【数据结构与算法】:关于时间复杂度与空间复杂度的计算(C/C++篇)——含Leetcode刷题
|
5月前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
下一篇
无影云桌面