![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法基础
文章平均质量分 58
夜阑卧听风吹雨,铁马冰河入梦来
用最孤独的时光塑造出最好的自己,才能笑着说起那些云淡风轻的过去~
展开
-
LeetCode141-142环形链1、2⭐️
判断链表是否有环,获取有环链表的入环点,哈希表方法&弗洛伊德龟兔赛跑法原创 2024-09-03 14:49:18 · 911 阅读 · 0 评论 -
LeetCode 128. 最长连续序列 ⭐️
给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)的算法解决此问题。4最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。9。原创 2024-08-21 15:05:34 · 267 阅读 · 0 评论 -
Leetcode 219. 存在重复元素 II⭐️
哈希表解决存在重复元素二问题原创 2024-08-20 10:48:49 · 480 阅读 · 0 评论 -
LeetCode 202. 快乐数⭐️
快乐数的解法原创 2024-08-19 19:53:07 · 1037 阅读 · 0 评论 -
LeetCode 15. 三数之和⭐️
给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。原创 2024-08-19 10:00:06 · 141 阅读 · 0 评论 -
Leetcode 49 字母异位词分组
给你一个字符串数组,请你将组合在一起。可以按任意顺序返回结果列表。是由重新排列源单词的所有字母得到的一个新单词。原创 2024-08-16 09:35:44 · 366 阅读 · 0 评论 -
LeetCode 242 有效的字母异位词
给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。sttrues= "rat",t= "car"falset如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?原创 2024-08-15 19:11:28 · 284 阅读 · 0 评论 -
LeetCode290 单词规律
所以也是同样用两个map,一个记录a:dog这样的映射规律,一个map记录dog:a这样的映射记录。该题思路与LeetCode205 同构字符串一样,都是判断对应关系是否唯一的。当map中key存在时,如果值与当前遍历的值不相同,就返回false。中的每个非空单词之间存在着双向连接的对应规律。里的每个字母和字符串。是否遵循相同的规律。原创 2024-08-15 09:22:51 · 326 阅读 · 0 评论 -
LeetCode 205 同构字符串
给定两个字符串s和t,判断它们是否是同构的。如果s中的字符可以按某种映射关系替换得到t,那么这两个字符串是同构的。每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。原创 2024-08-14 14:01:37 · 324 阅读 · 0 评论 -
LeetCode 383. 赎金信
ransomNote和magazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回false。magazine中的每个字符只能在ransomNote中使用一次。原创 2024-08-14 10:48:12 · 469 阅读 · 0 评论 -
LeetCode1. 两数之和
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。[0,1]因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。[1,2][0,1]原创 2024-08-13 10:12:44 · 235 阅读 · 0 评论 -
LeetCode 3 无重复字符的最长子串⭐️
给定一个字符串s,请你找出其中不含有重复字符的的长度。3因为无重复字符的最长子串是"abc",所以其长度为 3。1因为无重复字符的最长子串是"b",所以其长度为 1。3因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是的长度,"pwke"是一个子序列,不是子串。原创 2024-08-13 09:55:18 · 619 阅读 · 0 评论 -
LeetCode 链表两数相加⭐️
给你两个的链表,表示两个非负的整数。它们每位数字都是按照的方式存储的,并且每个节点只能存储数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。原创 2024-08-12 11:10:27 · 1355 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器
我们能够发现不管是左指针向右移动一位,还是右指针向左移动一位,容器的底都是一样的,都比原来减少了 1。这种情况下我们想要让指针移动后的容器面积增大,就要使移动后的容器的高尽量大,所以我们选择指针所指的高较小的那个指针进行移动,这样我们就保留了容器较高的那条边,放弃了较小的那条边,以获得有更高的边的机会。在这种情况下想要让容器盛水变多,就只有在容器的高上下功夫。一开始两个指针一个指向开头一个指向结尾,此时容器的底是最大的,接下来随着指针向内移动,会造成容器的底变小,轴共同构成的容器可以容纳最多的水。原创 2024-08-01 11:26:28 · 268 阅读 · 0 评论 -
LeetCode 167. 两数之和 II - 输入有序数组
使用哈希表,用一个map存元素和元素对应下标,然后判断map中是否包含key为target-numbers[i]的元素,如果在就找到了。因此 index1 = 1, index2 = 2。返回 [1, 2]。因此 index1 = 1, index2 = 2。因此 index1 = 1, index2 = 3。当头+尾>target,说明尾不动的情况下,所有的和都大于target,所以需要,尾向左移。当头+尾原创 2024-07-31 17:30:06 · 290 阅读 · 0 评论 -
LeetCode 392. 判断子序列
如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?思路:快慢指针思想,快指针遍历字符串t,慢指针指向字符串s中的字符,如果t中遇到与s中字符相同的,慢指针移动,否则快指针移动。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。优化版本:特殊场景也可容纳,主要是循环中加了条件,j<t.length();特殊场景s="",或t=""或s="",t=""原创 2024-07-31 10:30:21 · 157 阅读 · 0 评论 -
Leetcode189. 轮转数组
注意:如果翻转的次数超过了数组长度,实际上与k%size反正次数效果是一样的,所以需要。所以方法就是写一个翻转数组的方法,然后将整个数组翻转0,n-1。可以看做是先将数组翻转[7,6,5,4,3,2,1]向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]然后将前3个数组翻转,后三个数组翻转。然后将前k个元素翻转,0,k-1。然后将后边元素翻转,k,n-1。,将数组中的元素向右轮转。这个题目找到规律就好写点。原创 2024-07-29 19:38:18 · 142 阅读 · 0 评论 -
Leetcode 169. 多数元素
给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数⌊ n/2 ⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。32思路:可以想象成为多帮派投票选取黑帮老大的场景,首先我方选一个人当老大,计数为1再来一个投票人,如果这个人是我方势力,那么计数加1如果不是我方势力,那么计数减一,敌我双方同归于尽1个,这时需要看看我方计数是否已经归0,如果已经归0,说明我方已经没人了,需要重新选新的老大,然后重新开始附摩尔算法。原创 2024-07-29 10:38:42 · 948 阅读 · 0 评论 -
移除链表中值为val的元素
如果当前值==val,那么就将pre.next指向curr.next,,然后将curr后移,指向curr.next,pre不需要移动,因为curr的pre还是pre。示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]示例 2: 输入:head = [], val = 1 输出:[]定义一个pre指向当前元素的上一个元素。定义一个curr节点指向当前元素。原创 2024-07-25 19:51:14 · 164 阅读 · 0 评论 -
子数组和为k&子数组和最大
详细来说,就是通过预处理计算出以第 0 个元素起始,到第 i 个元素结尾的元素之和,并将其记录为数组 sum,从而实现通过 sum[i] - sum[j] 快速计算 [j ,i] 位置的元素和,这样的问题就是前缀和问题。那么上述问题可以改为sum[i]-sum[j]=k,再次转换可以转换为,nums[i]-k=nums[j]的问题。例如[0,1,2,3,5,6,-1,-2],前缀和为[0,1,3,6,11,17,16,14]有多少个nums[j]=nums[i]-k,就是有多少个符合和为k的子数组。原创 2024-07-23 19:54:52 · 326 阅读 · 0 评论 -
查找字符串数组中的最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。"fl"""输入不存在公共前缀。原创 2024-07-12 10:00:05 · 246 阅读 · 0 评论 -
长度最小的子数组
这种场景下,窗口和仍然是大于等于目标值的,如果不用while,那么就开始移动结束位置元素,起始位置不动了,实际上窗口内元素只有在小于目标值时,才能移动结束位置,否则需要移动开始位置。只用一个for循环,这个循环的索引,一定是表示 滑动窗口的终止位置。当窗口内元素和大于等于目标值时,就要向前移动。为什么内层不用if判断而要用while。如果不存在符合条件的子数组,返回。是该条件下的长度最小的子数组。找出该数组中满足其总和大于等于。个正整数的数组和一个正整数。原创 2024-07-11 10:40:25 · 415 阅读 · 0 评论 -
有序数组的平方
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置。按正数,负数分开两半,平方后最大的数,肯定是在两边,而不会是在中间。然后已经放入到新数组的指针移动,同时新数组放元素的指针也要移动。此时可以考虑双指针法了,i指向起始位置,j指向终止位置。最简单思路是先平方,后排序,但是与题目要求复杂度不符。平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]组成的新数组,要求也按。原创 2024-07-11 09:36:45 · 306 阅读 · 0 评论 -
找到最长的回文子串
先找出字符串的所有子串,然后判断每个字串是否是回文字符串,定义一个变量记录最大长度。回文子串的特点,对称位置字符相同。原创 2024-07-09 19:52:12 · 92 阅读 · 0 评论 -
算法题:买卖股票的最佳时机
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。暴力算法思路:假如第i天买入,那么需要从i+1到len-1,之间找一个比i大且最大的数来卖出,才能获取最大利益。给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。当天价格大于最小值,说明有利可图,就取之前的最大值,和当天的收益之中的最大值当做最大值。输入:prices = [7,6,4,3,1]输入:[7,1,5,3,6,4]原创 2024-07-09 19:33:34 · 421 阅读 · 0 评论 -
删除排序数组的重复项
题目解析:数组是有序的,意味着相同元素必须是连着的,java中数组没有删除方法,需要进行替换才能剔除重复元素。函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。给定 nums = [0,0,1,1,1,2,2,3,3,4],给定数组 nums = [1,1,2],使得每个元素最多出现两次。原创 2023-05-30 10:27:42 · 632 阅读 · 0 评论 -
Leetcode刷题(第20题)——有效的括号
【代码】Leetcode刷题(第20题)——有效的括号。原创 2023-05-25 13:54:30 · 84 阅读 · 0 评论 -
算法面试题目
1.斐波那契三角形# 斐波那契三角形# [1]# [1, 1, 1]# [1, 1, 2, 1, 1]# [1, 1, 2, 3, 2, 1, 1]# [1, 1, 2, 3, 5, 3, 2, 1, 1]# [1, 1, 2, 3, 5, 8, 5, 3, 2, 1, 1]# [1, 1, 2, 3, 5, 8, 13, 8, 5, 3, 2, 1, 1]def fib(n): if n == 1: return 1 if n == 2:原创 2020-09-24 15:38:29 · 129 阅读 · 0 评论 -
单链表--python实现
#!usr/bin/python# -*- coding: utf-8 -*-# 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。单链表是一种链式存取的数据# 结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针# (指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。它的每个节点包含两个域,一个信息域(元素域)# 和一个链接域。这.原创 2020-09-24 15:20:51 · 220 阅读 · 0 评论 -
二叉树排序
#!usr/bin/python# -*- coding: utf-8 -*-class Node: def __init__(self, value=None, left=None, right=None): self.value = value self.left = left self.right = rightdef preTraverse(root): ''' 前序遍历,根左右 ''' if roo.原创 2020-08-12 16:06:52 · 406 阅读 · 0 评论 -
栈,队列,双端队列的python实现
#!usr/bin/python# -*- coding: utf-8 -*-# 栈的操作# stack() 创建一个新的空栈# push(item) 添加一个新的元素item到栈顶# pop() 弹出栈顶元素# peek() 返回栈顶元素# is_empty() 判断栈是否为空# size() 返回栈的元素个数# 栈的特点:后进先出,装子弹的弹夹,只能从栈顶入栈和出栈class Stack: def __init__(self): self.li = [].原创 2020-09-23 17:32:14 · 200 阅读 · 0 评论 -
排序算法之快速排序
#!usr/bin/python# -*- coding: utf-8 -*-import sys# sys.setrecursionlimit(1000000) 设置递归深度# 思路:1.选取第一个数,让它归位,即让它前边的数都比它小,后边的数都比它大# 2.归位后,分为前后两部分,分别让前后两部分的每一个数进行归位,进行递归即可def pational(li, left, right): temp = li[left] #待归位元素 while left < rig.原创 2020-09-23 17:11:00 · 96 阅读 · 0 评论 -
排序算法lowB三人组--冒泡排序-选择排序-插入排序
1.冒泡排序#!usr/bin/python# -*- coding: utf-8 -*-# 冒泡排序# 思路:从第一个数开始,与其后边元素比较,如果后边数比前边数小,就交换位置,一趟排序后最值元素到了尾部# 外层循环表示需要比较的趟数,趟数是n-1次,每一趟可以确定一个元素# 内层循环表示一趟比较需要比较多少次,第一次排序后,最末尾元素就成最大或最小元素了,第二次比较,最后两个元素就成最大或最小元素了# 此后再比较,有序的不需要再进行比较,所以比较次数跟随i的变大而减小为n-1-i#原创 2020-09-10 14:18:25 · 275 阅读 · 0 评论