[算法] 使用“复杂”的数据结构降低时间复杂度
来源:互联网 发布:电陶炉 知乎 编辑:程序博客网 时间:2024/06/03 16:41
Leetcode 1: Two Sum
问题描述
给定一个整数数组和一个目标数,返回两个下标,使数组中这两个下标所代表的数字之和等于目标数。
你可以认为每组输入有且仅有一个正解,除此之外,两个下标不应当相等。例子:
给定一数组nums = [2, 7, 11, 15],目标数target = 9
因为nums[0] + nums[1] = 2 + 7 = 9 = target,所以最后返回[0, 1]。
解题思路
显然的,本题最直接明了的方式就是暴力循环两个数组,依次算出所有和,并判定它是否与目标数相等,可以写出:
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> ret { 0, 1 }; for (int i = 0; i < nums.size(); i++) { ret[0] = i; for (int j = i + 1; j < nums.size(); j++) { if (nums[i] + nums[j] == target) { ret[1] = j; return ret; } } } }};
这里我们发现,已知nums[i]和target,nums[j]可以取的值是固定的,所以可以不必每次都做加法运算,将内循环改为:
int tar = target - nums[i]; ret[0] = i; for (int j = i + 1; j < nums.size(); j++) { if (nums[j] == tar) { ret[1] = j; return ret; } }
但这里只是改进了常数级别的时间复杂度,有没有什么方法只遍历数组一次就解决呢?如果想要只遍历一次就解决,主要的矛盾还是在如何不必循环就快速的查询出target - nums[i]
是否在之前存在过。这里我使用了map作为查询的方法。
class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { map<int, int> exist; vector<int> ret { 0, 1 }; for (int i = 0; i < nums.size(); i++) { int comp = target - nums[i]; if (exist[comp] != 0) { ret[0] = exist[comp] - 1; ret[1] = i; return ret; } exist[nums[i]] = i + 1; } }};
果然,改进之后,时间复杂度大幅度降低。通过时间由166ms降低为9ms。
阅读全文
0 0
- [算法] 使用“复杂”的数据结构降低时间复杂度
- 使用二进制的思想降低时间复杂度
- 数据结构-算法的时间复杂度
- 算法时间复杂度和空间复杂的
- 数据结构-算法-时间复杂度
- 数据结构:算法的时间复杂度求法
- 数据结构——算法的时间复杂度
- 数据结构(四)算法的时间复杂度
- 常见的数据结构与算法时间复杂度
- 使用散列表来降低时间复杂度
- 数据结构 常用的算法的时间复杂度和空间复杂度
- 数据结构-算法效率的度量-时间复杂度和空间复杂度
- 数据结构(算法的时间复杂度和空间复杂度)
- 数据结构-算法-时间复杂度计算
- 数据结构 算法时间、空间复杂度
- 数据结构-递归算法-时间复杂度
- 数据结构与算法 -- 时间复杂度
- 数据结构-算法-时间复杂度计算
- JavaScript学习(1)
- 蓝桥杯 基础练习 字母图形
- java开发环境搭建
- Servlet登录与不登录拆分
- 关于“c语言从键盘输入字符串到指针数组”的问题
- [算法] 使用“复杂”的数据结构降低时间复杂度
- BZOJ1055:玩具取名(区间dp)
- Python 开发者的 6 个必备库
- centos 7 安装系统内核
- (二十九)hibernate 多对多
- maya(学习笔记)之Arnold材质
- Python 零碎知识
- Yum配置文件详解
- 2017.12.02.C语言总结