Author:吾爱北方的母老虎

原创链接:https://blog.csdn.net/weixin_41010198/article/details/80294783

第一题:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1]

Python实现代码:

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 定义一个列表,让其中小于target的值的数都放到检索的列表中nums2 = []for i in nums:if i>target:
#                 print("don't exit this two numbers")passelse:nums2.append(i)for i in nums2:for j in nums2:if nums2.index(i)==nums2.index(j):passif i+j==target:a = list([nums2.index(i),nums2.index(j)])print(a)
s = Solution()
s.twoSum([2,7,11,15],9)

[0,1]

[1,0]

用Python写的代码会有这个问题,而且是时间复杂度还很高

C++实现代码(有人说可以用哈希表来进行解决这个问题,但是我对哈希表不懂,所以还是先去补一下基础知识吧)

step 1:

class Solution(object):

def twoSum(self, nums, target):              """                                          :type nums: List[int]        :type target: int        :rtype: List[int]        """        list_len = len(nums)        for i in range(list_len):            for j in range(i+1,list_len):                if nums[i] + nums[j] == target:                    return [i,j]

Q:最后一个测试用例会超时,穷举法,循环了两次,时间复杂度O(N*N)

step2:这里是先生成一个哈希表(字典),然后循环过程中判断当前元素和哈希表(字典)中的数据相加是否满足条件,遍历nums,遍历过程中判断当前元素和哈希表(字典)中的值相加能不能满足要求,也就是target-当前元素的值在哈希表(字典)中是否存在,如果存在,就返回2个索引(注意是return[**,index]),如果不存在,那么当前元素存入哈希表(字典)。

class Solution:

def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        dic = dict()
        for index,value in enumerate(nums):
            sub = target - value
            if sub in dic:
                return [dic[sub],index]
            else:

dic[value] = index

这个是参照别人的解决方案

class Solution:def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""# 返回的下标列表rList = []# 记录已经找到的符合条件的数值,用来保证:每个输入都只会有一种答案,同样的元素不能被重用valueList = []# 遍历列表for i in range(len(nums)):for j in  range(i+1, len(nums)):if nums[i] + nums[j] == target:# 如果满足条件的数值之前没有遇到过,则将其下标加入列表if nums[i] not in valueList:rList.append(i)if nums[j] not in valueList:rList.append(j)valueList.append(nums[i])valueList.append(nums[j])return rListdef main():# 自定义测试用例rList = Solution().twoSum([2, 7, 11, 15, 3, 2, 18, 6], 9)print(rList)if __name__ == '__main__':main()

以上是我首先能想到的穷举算法,很明显这是最基础的做法,也叫暴力穷举.算法复杂度为:

时间复杂度为:O(N2)
空间复杂度为:O(1)

算法进化

我们知道对元素的搜索最快则是O(1),即直接索引到,联想只能是Hash表或者是关键字索引。关键字索引(从最小到最大)会占用额外的内存空间。

由于笔者在刷题的过程中顺便想练习一下Python基本语法,所以这里直接采用 Python的dict.

另外我们要求的是元素的索引,即Hash表的关键字,所以我们把数组元素作为dict的key,而把数组元素的索引作为dict的value

    def twoSum(self, nums, target):# 相当于哈希表dic = {}rList = []valueList = []# 我们要求的是元素的索引,即Hash表的关键字,所以我们把数组元素作为dict的key,而把数组元素的索引作为dict的valuefor i in range(len(nums)):dic[nums[i]] = ifor i in range(len(nums)):# 防止将同一对符合条件的值重复加入if i not in rList:# 将符合条件的两个元素成为互补元素# 差值是字典的key且对应互补元素的下标不是当前元素的下标if (target - nums[i]) in dic.keys() and dic[target - nums[i]] != i:# 当前元素没有参与过之前的互补配对if nums[i] not in valueList:rList.append(i)rList.append(dic[target - nums[i]])valueList.append(nums[i])return rList

采用哈希表来计算实际上是一个空间换时间的策略,该算法的算法复杂度为:

时间复杂度为:O(N)
空间复杂度为:O(N)

他山之石

网上查相关资料,有 先排序再用二分法 求符合条件的值的方法.但是,这里涉及到排序后原来的索引对应关系就都变了,这个时候找到符合条件的值后还需要找出对应原数组的索引,因为题目要求返回的是索引!

    def twoSum(self, nums, target):dic = {}rList = []valueList = []# 使用numpy对数组进行排序x = np.array(nums)pynums = np.sort(x)pyindexs = np.argsort(x)ahead = len(nums) - 1behind = 0# 从有序数组两边向中央逼近while ahead > behind:if pynums[ahead] + pynums[behind] == target:rList.append(pyindexs[behind])rList.append(pyindexs[ahead])ahead = ahead - 1behind = behind + 1elif pynums[ahead] + pynums[behind] < target:behind = behind + 1elif pynums[ahead] + pynums[behind] > target:ahead = ahead - 1return rList

这里的时间复杂度主要花在了对数组排序上,这里直接使用了python里的numpy.

由于python里的numpy可以对数组排序并返回排序后原数组下标,这样我们找到符合条件的值就比较容易找到原数组对应的下标了.该方法算法复杂度为:

时间复杂度为:O(NlogN)
空间复杂度为:O(N)

DS-1 数据结构和算法刷题相关推荐

  1. Ants (POJNo.1852)--数据结构与算法刷题记录

    数据结构与算法刷题记录1 时间:4.28 这是第一次用CSDN来记录自己的学习成果,在此留下纪念,希望自己能够坚持下去,变得更强. 本次学习记录来源于<挑战程序设计竞赛(第2版)> Ant ...

  2. 一夜登顶GitHub!字节内网数据结构与算法刷题笔记,看完直呼卧槽

    网络上流传着一句段子"程序员两条腿,一条是算法,一条是英文,想跑的更远,这两条腿都不能弱".英文,我们暂且不谈,我们先来谈谈算法. 算法之难,在于将精巧的逻辑,通过合适的数据结构, ...

  3. 数据结构与算法刷题记录

    数据结构与算法&程序语言 学习物料汇总: leetcode&牛客网 流畅的python 书签&网络搜索 leetcode 数据结构 数组 链表 栈&队列 字符串 算法 ...

  4. python数据结构与算法刷题——剑指offer第二版加部分leetcode题

    说不清楚,只能看代码理解的用红色标出 查找算法:查找较排序来说较简单,不外乎顺序查找和二分查找.哈希表查找和二叉排序树查找.(很多面试官喜欢让应聘者写出二分查找(如test53)的代码)[注意:二分查 ...

  5. python数据结构与算法40题_Python数据结构与算法刷题(2)——挖掘机技术哪家强...

    前言 前文传送门: 正文 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人 ...

  6. 字节跳动算法刷题宝典.pdf

    今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...

  7. Github最强算法刷题笔记.pdf

    资料一 昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙 ...

  8. 算法刷题宝典.pdf

    今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook. 力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且每题都 ru ...

  9. 神了,无意中发现一位1500道的2021LeetCode算法刷题pdf笔记

    昨晚逛GitHub,无意中看到一位大佬的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到. 关于算法刷题的困惑和疑问也经常听朋友们提及.这份笔记 ...

最新文章

  1. 12c adg添加数据文件报错处理ORA-01111
  2. Fedora 31安装RPMFusion源的方法
  3. 机器学习-朴素贝叶斯分类
  4. OpenCV3学习(4.1)——图像阈值操作(Threshold,AdaptiveThreshold)
  5. IT程序人生:学会写程序能从事哪些技术岗位?
  6. opengl GPU 纹理加速优化
  7. vue 按钮删除input内容_Vue表单和v-model
  8. 通过java.net.URLConnection发送HTTP请求
  9. 精确搜索linux日志,Linux 日志查询 - 精确详细
  10. 调试铁通与联通专线遇到的问题
  11. java线程设计模式_JAVA多线程设计模式
  12. 百度网盘高速下载器提示:高速受限!建议重新注册网盘账号使用
  13. JavaScript实现摩斯密码加密/解密
  14. 诸葛越:关于算法工程师职业发展的思考
  15. 完美破解PDF文件的防复制限制
  16. css-解决英文不换行的问题-word-break属性
  17. ubuntu系统中安装软件的三种方法
  18. 通过GPO的方式解决win10系统无法安装语言包
  19. android one s5,三星Galaxy S5和HTC One Max哪个好
  20. python gzip文件流解压方式

热门文章

  1. JAVA开发Web Service几种框架介绍
  2. Java 类的一些高级特征
  3. 【堆栈应用一】一个数divided=几个最小质因数的乘积
  4. houxiurong.com 关于Tomcat7部署 一台机器部署两个项目,一个用域名访问,一个用IP访问...
  5. 避免表格table被撑开变形的CSS代码实例
  6. avoid error when import AssemblyKeyFile
  7. python画三维几何图-Python下opencv使用笔记(二)(简单几何图像绘制)
  8. python3.5下载-Python3.5.2
  9. python语言命令大全-python常用命令
  10. python对于会计-会计转到数据分析值得吗?