基础算法
leetcode、牛客、剑指offer
瑾怀轩
三人行必有我师,欢迎交朋友。
个人博客:chenkequan.cn
展开
-
剑指 Offer II 016. 不含重复字符的最长子字符串
请注意,你的答案必须是子串的长度,"pwke"是一个子序列,不是子串。链接https//leetcode.cn/problems/wtcaE1。解释因为无重复字符的最长子字符串是"abc",所以其长度为3。解释因为无重复字符的最长子字符串是"b",所以其长度为1。解释因为无重复字符的最长子串是"wke",所以其长度为3。输入s="abcabcbb"输入s="pwwkew"输入s="bbbbb"来源力扣(LeetCode)输入s=""......原创 2022-07-19 15:26:44 · 144 阅读 · 0 评论 -
【leetcode】1217. 玩筹码
有 n 个筹码。第 i 个筹码的位置是 position[i] 。我们需要把所有筹码移到同一个位置。在一步中,我们可以将第 i 个筹码的位置从 position[i] 改变为:position[i] + 2 或 position[i] - 2 ,此时 cost = 0position[i] + 1 或 position[i] - 1 ,此时 cost = 1返回将所有筹码移动到同一位置上所需要的 最小代价 。输入:position = [1,2,3]输出:1解释:第一步:将位置3的筹码移动到位置1,原创 2022-07-09 11:06:00 · 1949 阅读 · 2 评论 -
剑指 Offer II 015. 字符串中的所有变位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 变位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。变位词 指字母相同,但排列不同的字符串。示例 1:输入: s = "cbaebabacd", p = "abc"输出: [0,6]解释:起始索引等于 0 的子串是 "cba", 它是 "abc" 的变位词。起始索引等于 6 的子串是 "bac", 它是 "abc" 的变位词。 示例 2:输入: s = "abab", p = "ab"输出: [0,1,2]解释:起始索引等于 0原创 2022-07-09 10:40:28 · 186 阅读 · 0 评论 -
剑指 Offer II 014. 字符串中的变位词
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。换句话说,第一个字符串的排列之一是第二个字符串的 子串 。示例 1:输入: s1 = "ab" s2 = "eidbaooo"输出: True解释: s2 包含 s1 的排列之一 ("ba").示例 2:输入: s1= "ab" s2 = "eidboaoo"输出: False 提示:1 ...原创 2022-07-08 11:51:29 · 187 阅读 · 0 评论 -
剑指 Offer II 013. 二维子矩阵的和
给定一个二维矩阵 matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。实现 NumMatrix 类:NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化int sumRegion(int row1, int col1, int row2, int col2) 返回左上角 (row1, col1) 、右下角 (row2, col2) 的子矩阵的元素总和。 示例 1:输入原创 2022-07-07 14:38:14 · 172 阅读 · 0 评论 -
【剑指offer】剑指 Offer II 012. 左右两边子数组的和相等
给你一个整数数组 nums ,请计算数组的 中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。示例 1:输入:nums = [1,7,3,6,5,6]输出:3解释:中心下标是 3 。左侧数之和 sum = nums[0] + nums[1]原创 2022-07-07 09:35:55 · 161 阅读 · 0 评论 -
【基础算法】用数组结构实现大小固定的循环队列
【思想简述】 定义存储数组和队头、队尾指针和已经入队中元素个数,做好队满和队空判断条件。这里queueSize可以使用rear和front关系进行替换。队列基础类:测试类:原创 2022-07-06 10:09:10 · 205 阅读 · 0 评论 -
【基础算法】 排序算法
【简述】相邻位置前面数 > 后面数 ---》交换 n-1 【每次换好一个数】时间复杂度:O(N^2)【简述】1~n中找最小数,与第1位置交换,然后从2~n中找 最小数,与2位置交换三、插入排序【简述】前边看做已排好序,后面每个数依次向前交换,直到找到合适位置。时间复杂度:最好情况:O(N^2) 最差情况:O(N) 平均情况:O(N^2)交换两数方法:方式一:方式二:四、归并排序【简述】先左侧部分排好序,再右侧部分排好序,两头都是有序的,准备一个有序数组,用外排序的方式,原创 2022-07-05 20:49:58 · 308 阅读 · 0 评论 -
【基础算法】用数组结构实现大小固定栈
【算法简述】:主要定义数组和top指针,确定好异常和边界情形。主体实现:测试类:原创 2022-07-05 20:51:41 · 185 阅读 · 0 评论 -
【基础算法】时间复杂度
常数时间操作:一个操作如果和数据量没有关系,每次都是固定时间完成的操作,叫做常数操作。时间复杂度为一个算法流程中,常数操作数量的指标。常用O来表示。具体来说,在常数操作的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(N),那么时间复杂度为O(f(N))评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间。去低阶,去系数🌰:一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数组长度为N,B数组长度为M。算法流程1.原创 2022-07-03 23:35:05 · 204 阅读 · 0 评论 -
leetCode-0001
一道简单题,难了我半天,手有些生疏了。总结下大佬的方法把:Python解法:方法一: 找到 anotherNum= target-num[i], 检查是否在list中, 若在: (1)判断该数出现1次,两个数相等,说明找的是自身 (2)判断该数出现多次,从该数后面开始找,需要判断找到的下标是否合法,检查。def twoSum(nums, target): lens = len(nu...原创 2020-11-10 22:46:56 · 655 阅读 · 0 评论 -
LeetCode 26、删除排序数组中的重复项
前期学业繁忙,对java和pyhon的编码能力有些遗忘,手也有些生疏,今天开始锻炼下编码能力同时可以把算法联系一下。做了一道比较简单的题,但是手感、编程环境部署、审题大意、自己太菜导致做了比较久。废话不多说,进入正题题目简介:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。调用方式(以后做题要注意):你可以想象内部操作如下:// nums原创 2021-06-13 20:15:45 · 1070 阅读 · 1 评论 -
【Leetcode】780. 到达终点
【首先思路】辗转相减 ,大概率超时。【递归剪枝】class Solution: def reachingPoints(self, sx: int, sy: int, tx: int, ty: int) -> bool: #使用递归方法 #结束条件 #当 某一对应坐标小于输入值时,表示不能转换 if tx < sx or ty < sy: return False ...原创 2022-04-09 22:20:18 · 268 阅读 · 0 评论 -
剑指 Offer II 011. 0 和 1 个数相同的子数组
给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。示例 1:输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。示例 2:输入: nums = [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/.原创 2022-04-21 14:36:50 · 569 阅读 · 0 评论 -
剑指 Offer II 010. 和为 k 的子数组
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2解释: 此题 [1,1] 与 [1,1] 为两种不同的情况示例 2:输入:nums = [1,2,3], k = 3输出: 2来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/QTMn0o【穷举法】:class Solution: def subarrayS.原创 2022-04-20 15:52:11 · 667 阅读 · 0 评论 -
剑指 Offer II 009. 乘积小于 K 的子数组
给定一个正整数数组 nums和整数 k ,请找出该数组内乘积小于 k 的连续的子数组的个数。示例 1:输入: nums = [10,5,2,6], k = 100输出: 8解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。需要注意的是 [10,5,2] 并不是乘积小于100的子数组。示例 2:输入: nums = [1,2,3], k = 0输出: 0来源:力扣(Leet.原创 2022-04-15 20:00:03 · 961 阅读 · 0 评论 -
剑指 Offer II 008. 和大于等于 target 的最短子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组[4,3]是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出:1示例 ..原创 2022-04-12 19:40:27 · 725 阅读 · 0 评论 -
剑指 Offer II 007. 数组中和为 0 的三个数
给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素a ,b ,c ,使得a + b + c = 0 ?请找出所有和为 0 且不重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/...原创 2022-04-11 22:18:28 · 93 阅读 · 0 评论 -
剑指 Offer II 007. 数组中和为 0 的三个数
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 3000 -105&...原创 2022-04-11 17:21:38 · 907 阅读 · 0 评论 -
剑指 Offer II 006. 排序数组中两个数字之和
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。示例 1:输入:numbers = [1,2,4,6,10], targ原创 2022-04-11 15:20:07 · 95 阅读 · 0 评论 -
剑指 Offer II 005. 单词长度的最大乘积
【python 快速版】class Solution: def maxProduct(self, words: List[str]) -> int: #计算两个字符串是否有相同字符,没有 则返回两字符串长度的乘机 def compareString(str1 , str2): #将str2 放入字典 setstr2 = set(str2) flag = Fals..原创 2022-04-08 20:26:04 · 311 阅读 · 0 评论 -
剑指 Offer II 004. 只出现一次的数字
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。示例 1:输入:nums = [2,2,3,2]输出:3示例 2:输入:nums = [0,1,0,1,0,1,100]输出:100提示:1 <= nums.length <= 3 * 104-231 <= nums[i] <= 231 - 1nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次进阶:你..原创 2022-04-07 23:34:25 · 148 阅读 · 0 评论 -
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数
【快速版】:主要思想,累出法,每个数求。用位运算代替除2class Solution: def countBits(self, n: int) -> List[int]: num = 0 res = [] while num <= n: #使用递推减少运算 #将每个数求余后 移位 再减,直到为零 i = num count = 0 w..原创 2022-04-06 17:32:17 · 357 阅读 · 0 评论 -
剑指 Offer II 002. 二进制加法
第一种思路: 设置两个游标,从右到左像十进制加法一样,两位相加,遇2进位。进位上唯一补最高位。python代码:class Solution: def addBinary(self, a, b) -> str: res = "" i1 , i2 ,carry = len(a)-1 , len(b)-1 , 0 while i1 >= 0 or i2 >= 0: ..原创 2022-04-06 15:19:56 · 559 阅读 · 0 评论 -
剑指 Offer II 001. 整数除法
这个虽说简单题,缺少逆向思维,很难完成。【思路概要】:累减 代替 除法 (会超时) 位运算 (主要使用位移运算 简化 其中循环操作,目的快速是被除数减小)第一种方法:(会超时)class Solution: def divide(self, a: int, b: int) -> int: #使用减法来代替除法 #定义最大值和最小值 INT_MAX,INT_MIN = 2**31 -1 , -...原创 2022-04-04 15:26:32 · 375 阅读 · 0 评论 -
【剑指offer】- JZ6 从尾到头打印链表
题目:描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]0 <= 链表长度 <= 10000示例:输入:{1,2,3}返回值:[3,2,1]python代码:# class ListNode:# def __init__(self, x):# self.val = x# self.ne...原创 2022-04-02 11:10:35 · 152 阅读 · 0 评论 -
【剑指offer】 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]输入:["CQueue","deleteHead","appendTail","appendTail"..原创 2022-04-02 19:02:09 · 108 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
快速实现代码:class MinStack: def __init__(self): """ initialize your data structure here. """ #申请二维数组,一维存数据,一维存当前最小值 self.stack = list() self.topnum = -1 def push(self, x: int) -> None: #...原创 2022-04-02 21:15:01 · 746 阅读 · 0 评论