前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[刷题计划]算法开篇

[刷题计划]算法开篇

作者头像
你呀不牛
发布2021-11-12 09:19:04
2040
发布2021-11-12 09:19:04
举报
文章被收录于专栏:我要变牛我要变牛

一直想着开始刷刷题,即便是不出去面试,也能锻炼下思维逻辑,但是总是半途而废

由此便想到了作为学渣的我,高中英文被单词时经常连第一个abandon都记不住,这就跟现在的力扣算法第一题一样,记得多年前其实是看过思路的,现在发现做的还是磕磕绊绊

那就趁着掘金活动,把一些题结合这自己的理解,保证每天一道题的速度到春节吧,以此为证

1单词表中的abandon

万事开头难,现在就从单词第一个入手,这道本身也不难,所以就从他开始了

2two 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

代码语言:javascript
复制
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];
}
代码语言:javascript
复制
提交结果 执行用时 内存消耗
通过       56 ms     38.7 MB 

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

实现2

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

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

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

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

代码语言:javascript
复制
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];
}
代码语言:javascript
复制
提交结果 执行用时 内存消耗
通过       2 ms     38.1 MB 

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

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

3举一反三

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

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

例如在业务中,

输入->输出

0->0 1->1, 2->1, 3->2, 4->3, 5->5

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

代码语言:javascript
复制
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];
}

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 你呀不牛 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1单词表中的abandon
  • 2two sum
    • 题目
      • 示例
        • 思路
          • 实现1
            • 实现2
            • 3举一反三
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档