数据结构与算法
飞猫侠
渴望一流技术的三流技术宅
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Leetcode practice (10)
Tuple with Same Product题目描述:给定一个无重复且为正整数的数组,返回一个四维元组(a, b, c, d), 元组内部满足 a * b = c * d 且a != b != c != d, 求满足这样的元组个数 思路:最简单的思路就是暴力求解,嵌套遍历数组4次,将符合条件的组合计数即可,但是发现这样复杂度是 O(n^4), 使用c++也超时了,因此要找到一种更优的解法。先从条件 a * b = c * d下手,数组中两个元素的乘积,其实就是从数组中选取两个进行组合,即 C(2,.原创 2021-02-13 23:35:30 · 268 阅读 · 1 评论 -
Leetcode practice (9)
Longest Word in Dictionary题目描述:给定一个包含英文字符串的列表,请给出最长由列表内字符组成的英文字符串 思路:拿到题目,开始考虑构建字典树,然后遍历列表,统计出每个字符串在字典树中包含公共前缀字符的个数,挑选出包含最大个数即可,但是问题会存在同时包含最大公共前缀存在多个字符串的情况,所以需要对这部分字符串再进行末尾字符的排序,返回结果。这种解法,直观也容易想到,但是提交后时间复杂度还是较高,260ms,只击败了15%的提交结果,所以看起来不是很优的解法,后面看了别人的解法,原创 2021-02-13 00:52:19 · 263 阅读 · 1 评论 -
Leetcode practice (8)
Swap Nodes in Pairs题目描述:给定一个链表,反转每两个节点思路:首先需要对链表的结构非常熟悉,python对于链表的实现和表示十分简洁,拿到题目下意识会去思考关于链表的反转,需要改变每一个节点的指向,但是需要控制每两个节点进行反转,需要递归,一时半会还想不到如何递归。后来发现其实不需要走改变节点指向这一种思路,可以交换当前节点和下一个节点的值即可。 code:# Definition for singly-linked list.# class ListNode:#原创 2020-10-05 17:19:58 · 220 阅读 · 1 评论 -
Algorithm ----- Binary Search
关于二分法之前一直没有深入去体会该思想,平时在工作当中能采用 O(N) 复杂度就可以完成的任务,也不会太过考虑将复杂度降低到 O(logN), 但是二分法用的好,着实可以优化算法的时间复杂度,因此这是一个好方法,有必要掌握熟练。创建一个有序的数组import numpy as nparr = np.sort(np.unique(np.random.randint(0, ...原创 2020-01-31 19:51:51 · 285 阅读 · 0 评论 -
Leetcode practice (7)
Split a String in Balanced Strings题目描述:给定一个平衡字符串,即偶数长度字符串。字符串只包含字符 L 和 R,要求输出字符串当中所有对称字符子串数目。 思路:构造一个栈放置字符串首字符在栈底,依次遍历字符串除首字符剩下字符,若当前字符和栈底元素不相等,则将栈底元素出栈;若当前字符和栈底元素相等,则将当前字符入栈;每次出栈后,若栈为空,则计数,最终将计数结果...原创 2019-10-14 05:45:32 · 227 阅读 · 1 评论 -
Leetcode practice (6)
Climbing Stairs题目描述:爬楼梯,一次只能爬1step or 2step,给定一个非负数,问有多少种不重复的爬法。 思路:乍看一下题目,还在思考如何枚举出所有可能的情况,eg,给定2,那么组合就是【1,1】,【2】;给定3,那么组合就是【1,1,1】【1,2】【2,1】, 其实用递归的思路去想就是当元素值等于1 or 等于2时,停止。后面发现该题目就是Fibonacci数列的...原创 2019-10-13 00:06:55 · 183 阅读 · 0 评论 -
Leetcode practice (5)
Valid Anagram题目描述:给定两个字符串, 判断是否包含相同数目的字符. 思路:分别统计两个字符串包含字符频率, 最后进行比较即可, 这里给出两种不同语言的实现方式. python用dict进行字符频率统计, 最后比较dict是否相等即可(这里比想象中要高级, 应该是内部方法的实现). cpp用数组实现, 预分配一个长度为26的数组, 其索引对应26英文字母, 依次遍历...原创 2019-10-04 23:34:10 · 179 阅读 · 0 评论 -
Algorithm string ----- reverse
字符串相关算法是计算机算法处理当中最常规的操作,下面记录字符串反转的相关方法、实现以及算法分析。算法实现 首先,创建一个字符串str_ = "algothrim" 方法一,将字符串转换为列表,调用reverse方法即可。# way_1def func_1(s): l = list(s) l.reverse() return...原创 2019-10-04 22:14:58 · 261 阅读 · 0 评论 -
Leetcode practice (4)
Best Time to Buy and Sell Stock题目描述:给定一个股票价格序列,找出最大的盈利。 思路:该题目有两种思路,第一种,直接暴力枚举所有后一时间点和前一时间点之间的价格差,找出最大值;第二种,属于动态规划思想,遍历整个序列,每次都重新选择最低价格点和最大价格差,最后得出最优解。 code:# 暴力枚举public class Solution { pu...原创 2019-09-13 22:55:05 · 167 阅读 · 0 评论 -
Leetcode practice (3)
DI String Match题目描述:给定一个只包含D和I字符的字符串,按照字符串长度进行递增递减,出现I表示递增,出现D表示递减,最后输出列表。 思路:按照题目描述,遍历输入字符串,进行条件判断后进行递增or 递减即可。 code:class Solution(object): def diStringMatch(self, S): lo, hi = 0, ...原创 2019-09-05 07:54:33 · 213 阅读 · 0 评论 -
Leetcode practice (1)
Height Checker题目描述:返回未站在正确位置的学生的最小人数。 思路:先对原输入数组排序,再将排序后的数组与原数组做比较,统计它们对应元素不相等的个数即可。 code:class Solution: def heightChecker(self, heights: List[int]) -> int: temp = heights.co...原创 2019-06-10 02:08:58 · 206 阅读 · 0 评论 -
Leetcode practice (2)
Self Dividing Numbers题目描述:给定一个序列区间,序列中元素可以整除自己所包含的所有数字。 思路:遍历一遍序列区间,将每个数字拆分成个位数,让序列元素对其包含数字求余,将满足条件的元素插入列表即可。 code:class Solution: def selfDividingNumbers(self, left: int, right: int) -> ...原创 2019-06-14 00:33:46 · 186 阅读 · 2 评论 -
Sorting Algorithm(2)
在轮子越来越多,越来方便调用的今天,基础算法的实现也被淡忘,虽然工作中不太需要自己造基础轮子,但其背后的思想对提高编程水平还是很有指导意义,特此记录。 创建随机数组import numpy as nparray = np.random.randint(0, 100, 1000)冒泡排序def bubble_sort(input_array): arr...原创 2019-05-27 13:25:54 · 291 阅读 · 0 评论 -
Algorithm tree ----- DFS、BFS
一个多叉树结构如下图所示:创建如图所示的数据结构,用镶套字典实现。# 创建多叉树d = {"x": {"a": {"b":{}, "c":{}, "d": {}}, "e":{"f":{"g": {}, "k": {}}}}}深度优化遍历# dfs 递归实现ans = -1nodes = []def dfs(d, deep): global ans ...原创 2019-05-20 06:04:38 · 318 阅读 · 0 评论 -
Data structure ----- List
做为一个调包侠,长期用现成的轮子干活,已经严重限制了个人编程水平的提升。所以想要从本质上提升自己的编程水平,还是要抽时间自己造轮子。虽然说现在语言越来越高级,轮子越来越丰富,但是内功心法才是成才之道。 链表做为基础的线性结构,很多复杂的数据结构基本由其演变而来,因此有必要熟练掌握。 实现代码如下:# include<iostream&...原创 2018-07-17 17:35:58 · 319 阅读 · 0 评论 -
Sorting Algorithm(1)
为了加强自己的计算机思维和编程功底,会尝试使用底层语言来实现一下传统算法,目的加强基本功的同时督促自己坚持学习。 插入排序 插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。# include// 定义输入函数templatetypename type> void inputnumber(type *原创 2017-11-10 20:51:39 · 282 阅读 · 0 评论
分享