算法题
文章平均质量分 84
只需倾听
这个作者很懒,什么都没留下…
展开
-
算法练习第29天|1005.K次取反后最大化的数组和
贪心的思路:尽可能将绝对值比较大的负数取反成正数,正数保持不变。所以需要按照绝对值的大小对数组先进性依次排序。然后依次遍历元素,若为负数且k不为0,则将该负数取反。最后若k还有剩余,全作用到绝对值最小的最后那个元素上,这样能保证数组和最大化。选择下标 (1, 2, 2) ,nums 变为 [3,1,0,2]。选择下标 (1, 4) ,nums 变为 [2,3,-1,5,4]。选择下标 1 ,nums 变为 [4,-2,3]。以这种方式修改数组后,返回数组。可以多次选择同一个下标。原创 2024-07-09 21:39:21 · 259 阅读 · 0 评论 -
算法练习第28天|122.买卖股票的最佳时机 II、55.跳跃游戏
因为要获取最大的利润,所以贪心的思想就是,在遍历所得到的利润时,如果利润为正,则可以买入一次第二天再卖出,准备下一轮的买入。由于第四天的价格为10,所以我第三天以5的价格买入,第四天以10的价格卖出,又获利了5元。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。原创 2024-07-06 23:29:42 · 853 阅读 · 0 评论 -
算法练习第27天|455.分发饼干、376摆动序列、53. 最大子序和
从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。以数组nums = [-2,1,-3,4,-1,2,1,-5,4]为例,如果 -2,1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。原创 2024-07-05 11:50:34 · 371 阅读 · 0 评论 -
算法练习第26天|46.全排列、47全排列II
每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了。原创 2024-06-01 20:52:13 · 691 阅读 · 0 评论 -
算法练习第25天|491. 非递减子序列
491. 非递减子序列。原创 2024-06-01 18:46:21 · 805 阅读 · 0 评论 -
算法练习第24天|78.子集、 90.子集II
78. 子集 - 力扣(LeetCode)原创 2024-05-19 22:26:36 · 199 阅读 · 0 评论 -
算法练习第23天|131.分割回文串、93.复原IP地址
回溯函数除了参数除了需要字符串,还用到了老朋友result和path(也可以去掉,因为是全局的)。判断回文的函数有三个参数,字符串本身s,字符串起始位置start以及字符串末尾位置(最后一个字符的位置)。回溯第三步就是提取未探索区域的子串,然后判断子串是否为回文串 ,如果是,path记录,然后未探索区域进一步缩小,进行递归,回溯。我们在前面的文章中讲到,如果从一个集合中取组合就需要使用startIndex(见这篇博文39题的思路分析部分)。其实本题的切割问题也可以看作前面题目中从集合中取元素的问题。原创 2024-05-18 19:22:25 · 599 阅读 · 0 评论 -
算法练习第22天|39. 组合总和、40.组合总和II
39. 组合总和39. 组合总和 - 力扣(LeetCode)原创 2024-05-15 18:29:40 · 865 阅读 · 0 评论 -
算法练习第21天|216.组合总和|||、17.电话号码的字母组合
一般来说,回溯函数的返回值类型为void,至于参数,为了表达方便,我们定义了目标和targetSum(即题目中的n)、k、遍历到当前路径的和sum、以及每一层回溯的开始索引startIndex。index表示遍历到了digits的第几个数字,其初始值为0,遍历过一个数字后就会+1,那么当index等于digits.size()时,表明遍历完毕。在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。给出数字到字母的映射如下(与电话按键相同)。原创 2024-05-14 16:32:22 · 858 阅读 · 0 评论 -
算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。其本质是穷举,穷举所有可能,然后选出我们想要的答案。2.为什么要有回溯算法?那么既然回溯法并不高效为什么还要用它呢?因为有的问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式棋盘问题:N皇后,解数独等等。原创 2024-04-18 21:40:15 · 1112 阅读 · 0 评论 -
算法练习第19天|222.完全二叉树的节点个数
222. 完全二叉树的节点个数 - 力扣(LeetCode)原创 2024-04-17 14:27:38 · 986 阅读 · 0 评论 -
算法练习第18天|111.二叉树的最小深度
111. 二叉树的最小深度 - 力扣(LeetCode)原创 2024-04-16 21:47:21 · 1038 阅读 · 0 评论 -
算法练习第17天|104.二叉树的最大深度 、559.N叉树的最大深度
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最大深度==二叉树的层数==根节点的深度==根节点的高度==第二层节点的最大高度+1。二叉树某个节点的深度:指从根节点到该节点的最长简单路径边的条数。二叉树某个节点的高度:指从该节点到叶子节点的最长简单路径边的条数。原创 2024-04-16 20:11:22 · 825 阅读 · 0 评论 -
算法训练第5天|哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
哈希表是根据的值而直接进行访问的数据结构。原创 2024-01-15 20:21:30 · 1845 阅读 · 1 评论 -
算法练习第12天|● 239. 滑动窗口最大值● 347.前 K 个高频元素
其中 push(int val) 表示val入队,它的规则是:如果val前面的元素比val小,那么就将这些数通过pop_back弹出,直到遇到比val大的数停止或队列为空停止。所以为了更加方面的对多余元素进行剔除,单调队列在用STL容器中的双端deque进行实现,因为deque支持在队列两端进行入队、出队操作。窗口滑动之后,3不在是窗口内的数,所以需要使用pop_front将单调队列中的3弹出。如下图所示,单调队列的入队规则是如果入队的元素前面有比自己小的数,这些数全部被。你只可以看到在滑动窗口内的。原创 2024-04-08 18:32:32 · 687 阅读 · 0 评论 -
算法练习第14天|102.二叉树的层序遍历
层序遍历可以借助单向队列来实现。队列先进先出的特性,与按层次进行元素的先后遍历刚好思想统一。二叉树通过指针来实现树的构建,所以队列里面存的应该是指向节点的指针,而且遍历开始时存放的应该是。在记录完根节点对应的元素后,应该将根节点对应的左右子节点的指针入队(为下一层遍历做准备),同时将根节点指针出队(已经记录过了)。层序遍历与前面讲的递归实现二叉树的遍历属于不同思想。此外,对于较深的层,其节点数可能不唯一,这时候就需要在。(即逐层地,从左到右访问所有节点)。,而前面讲的递归遍历属于。,接着该节点的指针出队。原创 2024-04-11 14:34:27 · 307 阅读 · 0 评论 -
算法练习第15天|226.翻转二叉树
力扣链接题目描述:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。[2,3,1]root = [][]思路分析:翻转二叉树,其实就把每一个节点的左右孩子交换一下就可以了。注意,是的左右子节点。这就可以用到前面所将的二叉树递归遍历和层序遍历。下面分别使用前序递归,后序递归和层序遍历来实现。原创 2024-04-11 19:31:39 · 335 阅读 · 0 评论 -
算法练习第16天|101. 对称二叉树
力扣链接题目描述:给你一个二叉树的根节点root, 检查它是否轴对称。truefalse思路分析:对于二叉树是否对称,要比较的是是不是相互翻转的,而不是比较左右子节点。所以在递归遍历的过程中,。要比较子树的外侧与内侧。原创 2024-04-12 22:37:36 · 355 阅读 · 0 评论 -
算法练习第13天|递归实现 144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历
二叉树的存储方式:链式存储和顺序存储。链式存储用指针,顺序存储用数组。其结构如下图所示。原创 2024-01-23 17:56:29 · 1961 阅读 · 0 评论 -
算法练习第11天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值
题目描述:给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。s = "()"truetrues = "(]"false思路分析:使用栈 来实现左右括号的配对,遍历输入字符串:1.若为左括号则入栈2.若为右括号,则先看看栈是否为空,若为空,表明前面没有和该右括号匹配的左括号,return false;若不为空,则拿栈顶元素和该右括号判断是否为一对,若为一对,则出栈,遍历下一个字符。遍历完了之后,看一下栈是否为空。原创 2024-01-22 21:57:51 · 1006 阅读 · 0 评论 -
算法第10天|232.用栈实现队列225. 用队列实现栈
我们用c++容器中的单向queue来作为两个队列的基本实现,如果是双端队列deque没啥意义,因为两端都能出队入队,一端进,另一端出,直接就能当栈使用。queue的常用接口如下:构造函数://queue采用模板类实现,queue对象的默认构造形式//拷贝构造函数赋值操作://重载等号操作符数据存取:push(elem);//往队尾添加元素,入队操作,无返回值。pop();//从队头移除第一个元素,出队操作,无返回值。出队的元素不会被返回back();//返回最后一个元素。原创 2024-01-22 20:22:15 · 1787 阅读 · 0 评论 -
算法练习第7天|344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串
题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须、使用 O(1) 的额外空间解决这一问题。原创 2024-01-17 22:24:48 · 1334 阅读 · 0 评论 -
算法练习第6天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
题目描述:给你四个整数数组nums1nums2nums3和nums4,数组长度都是n,请你计算有多少个元组。原创 2024-01-16 20:09:38 · 1794 阅读 · 1 评论 -
算法训练第4天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
【代码】算法训练第4天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II。原创 2024-01-13 18:22:03 · 1343 阅读 · 1 评论 -
算法训练第三天|203.移除链表元素 707.设计链表 206.反转链表
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域,另一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。原创 2024-01-12 21:57:23 · 2020 阅读 · 1 评论 -
算法训练第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
代码中最小长度的初始值没有采用min_len = INT32_MAX,而是采用了nums.size()+1,因为子数组长度最大也就是nums.size()那么大。对于第二圈,13和14为上面的边,13为左闭,14为右开(不包含),因此14算到(14,15)这一条边的左闭,以此类推。,就很容易出问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。这样在走每一条边的时候,避免一会左开右闭,一会左闭右闭,一会又来左闭右开。所以,为了遍历,在所有遍历的边上采用左开右闭原则,即。原创 2024-01-11 20:46:42 · 2967 阅读 · 0 评论 -
算法训练第一天|数组理论基础,704. 二分查找,27. 移除元素
数组第 i 个元素与第 j 个元素间的内存地址(假设j > i)相差: (j - i)* 元素数据类型字节数。如int arr[],元素数据类型字节数为4;short arr[],元素数据类型字节数为2,以此类推。二维数组的存储顺序是按行来进行的。原创 2024-01-10 23:07:54 · 1968 阅读 · 1 评论