数据结构算法操作试题(C++/Python):数据结构算法操作试题(C++/Python)——目录 ---- 1....解答 python: 28ms, 12mb, 100% class Solution(object): def searchRange(self, nums, target):...index]: retIndexList[1] = i - 1 break return retIndexList 其他方法看
也就是说我们没办法直接求到结果,而需要对这些部分分别求水的体积,最后相加。 但是我们并不知道水坝中的水会被分成几个部分,所以直接求是不行的,那么有没有什么办法可以确定我们找到了一个完整的部分呢?...我们先把这个问题简化一下,在什么情况下水坝有存储水的能力呢? 如果水坝的高度递增行吗?那如果递减呢? 我们在纸上画一画很容易就想明白,递增和递减都不行,只有先递减再递增可以,也就是下图所示这样。 ?...也就是说用和刚才一样的方法划分完整的水域,只不过我们用两个指针从两边一起遍历,一个指针从左往右,另一个指针从右往左。还是一样,当碰到大于等于目前最大值的时候认为是一个完整的水域,计算面积。...似乎这种方法和上面的一样,但其实不然,仔细分析可以发现一个优化的点。 在之前的方法当中,我们并不确定我们从左往右一定可以找到比目前最大值更大的值。...既然我们可以保证两个指针会相遇在全局最大值,那么移动指针的时候就可以保证后面一定还会有更高的位置出现,那么我们就没必要等找到更大的值之后再计算水域面积了,就可以在当下直接计算了。
由于我们的main函数不被其他函数调用(注意:不是不可调用,是一般情况下不调用,如果你想挨骂的话…),所以就不能像其他函数一样,在程序运行中获取参数数据,那为什么还要有这个参数呢,实际上,这个参数是程序运行时...,利用操作系统传进来的,argc代表着指针数组的元素个数,argv[0]是程序所在计算机的完整路径,例如: C:\Users\fdog\Desktop\hello.exe。...总不能在代码中固定一个路径吧,大家计算机名字都不一样,这样肯定行不通,于是我们在代码中开始写到cout的路径”; 然后开始读取用户输入的路径,那么有没有进一步提升用户体验的写法?...栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。 ---- ?...,元素为指针 int (*p)[]; 数组(样式的)指针 本质是指针 上面出现的括号都是必要的,不可省略,说其是一种格式也不为过,指针XX和XX指针分不清主次,可以像我一样在两者之间加上
题目如下: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。...假设从小到大排序,那我们就拿到一个递增数组了,此时经典滑动窗口方法就可用了!怎么滑动呢?...那么 N 数之和(N > 2)都可以采用这个思路解决。 为什么没有更优的方法呢?我想可能因为: 无论几数之和,快排一次时间复杂度都是固定的,所以沿用三数之和的方案其实占了排序算法便宜。...你有没有想过,为什么快排用二分法,而不是三分法?为什么每次中间来一刀,可以最快排完?原因是二分可以用最小的 “深度” 将数组切割为最小粒度。...这道题双指针的移动规则比较巧妙,与上面普通题目不一样,重点不是在是否会运用滑动窗口算法,而是能否找到移动指针的规则。 当然你可能会说,为什么两个指针要定义在最两端,而非别的地方?
上一篇文章当中我们接触了两指针算法,在上一篇文章当中,我们使用了一快一慢两个指针来访问数组,从而避免了删除元素时需要移动数组的巨大开销。...优化 有些同学可能会很容易想到优化:我们这里使用了一重循环去单独计算下标区间[l, r]对应的元素和,我们完全可以引入前缀和数组,这样就可以在 O(1) 的复杂度内计算出区间和。...0 : ret; } }; 到这里可能会有同学会说,说了这么一大通有什么用,算法的复杂度还是 O(n^2) ,在本题当中一样会超时。...0 : ret; } }; 当然,我们也可以换一种写法,每次移动区间的右侧端点。这样每次移动了r之后都会引入新的元素,当达成条件之后,我们需要移动左侧端点,查看是否存在更优的情况。...同理,如果是左指针往右,需要右指针也往右。 在一些算法书中这样的算法被叫做滑动窗口,也有的叫做two pointers或者尺取法。不管叫什么名字,核心原理是一样的。
我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的元素都大于或者等于后面子数组的元素。我们还可以注意到最小的元素刚好是这两个子数组的分界线。...我们可以把第一指针指向该中间元素,这样可以缩小寻找的范围。同样,如果中间元素位于后面的递增子数组,那么它应该小于或者等于第二个指针指 向的元素。此时该数组中最小的元素应该位于该中间元素的前面。...我们可以把第二个指针指向该中间元素,这样同样可以缩小寻找的范围。我们接着再用更新之后的 两个指针,去得到和比较新的中间元素,循环下去。...按 照上述的思路,我们的第一个指针总是指向前面递增数组的元素,而第二个指针总是指向后面递增数组的元素。最后第一个指针将指向前面子数组的最后一个元素, 而第二个指针会指向后面子数组的第一个元素。...算法一: mid = (low + high) / 2 算法二: mid = low + (high – low)/2 乍 看起来,算法一简洁,算法二提取之后,跟算法一没有什么区别。
2、Two Points 除了上述二分搜索算法的处理方法之外,可能最简单暴力的方法就是通过嵌套循环找出长度最小的连续子数组,但是这种方法的时间复杂度为 O(n^2),有没有方法将其降低到 O(n)...你可以假设数组中不存在重复元素。 这一类型的题目在 Easy 中也出现过,如:【852. 山脉数组的峰顶索引】和【162. 寻找峰值】。 ...本题中,原本的递增数组被转化成包含两个递增序列的数组,并且其中无重复元素,那么就可以得出:第一个递增数组中的任意一个元素都大于第二个递增数组中的元素。 ...搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。 这道题是【153....而本题中的目标值的位置并不确定,所以在每次确定搜索区间时,需要考虑很多种情况: 如果当前搜索区间只落在一个递增区间上,那么和一般的处理方法没什么异样; 如果当前搜索区间横跨两个递增区间,那么就需要根据中间数在第一个递增区间还是第二个递增区间上分别处理
2、Two Points 除了上述二分搜索算法的处理方法之外,可能最简单暴力的方法就是通过嵌套循环找出长度最小的连续子数组,但是这种方法的时间复杂度为 O(n^2),有没有方法将其降低到 O(n) 的时间复杂度呢...你可以假设数组中不存在重复元素。 这一类型的题目在 Easy 中也出现过,如:【852. 山脉数组的峰顶索引】和【162. 寻找峰值】。 ...本题中,原本的递增数组被转化成包含两个递增序列的数组,并且其中无重复元素,那么就可以得出:第一个递增数组中的任意一个元素都大于第二个递增数组中的元素。 ...搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。 这道题是【153....而本题中的目标值的位置并不确定,所以在每次确定搜索区间时,需要考虑很多种情况:如果当前搜索区间只落在一个递增区间上,那么和一般的处理方法没什么异样;如果当前搜索区间横跨两个递增区间,那么就需要根据中间数在第一个递增区间还是第二个递增区间上分别处理
,即数组元素加起来大于等于target,此时这个解法就是暴力解法,不用我说,各位也可以知道这个时间复杂度应该是很高的,所以这个方法是不推荐的,不过我们可以先知晓暴力解法,然后在暴力解法的基础上,进行优化...此时我们还是看一看上述的暴力解法,并且我们需要观察题目的条件,此时题目告知我们,这个数组存储的元素都是正整数,所以我们可以知晓,我们通过不断的对元素相加,可以知晓加起来的数是会单调递增的,所以我们可以完全借助单调性进行这个代码的优化...继续往右走即可,这样做我们就可以通过减少步数减少时间复杂度,其实这个解法就是滑动窗口解法,可能很多读者朋友好奇此时为什么不叫双指针解法,它和双指针一样都用了两个指针,其实它多少也算是双指针一部分,但是,...它的限制条件多:就比如此时我们是要有单调性的,这样才可以用滑动窗口,并且滑动窗口其实我们在画图的时候,就和现实中我们滑动窗口一样,如下图所示: 此时我们依据上面讲述的,通过循环我们就可以做出来这个题目了...,我们首先就要进入入窗口的环节,此时我们就以哈希存储元素的方式入窗口即可,之后就进入判断环节,倘若此时的位置在哈希表中的个数超过1,我们就要循环的进行出窗口操作,直到left右移过程中,right位置的数据不大于
题目1:移除数组中指定的元素 题目链接:移除元素 - LeetCode 题目描述 解题思路 方法1 :暴力法 相信很多人看到这道题的时候,会不自觉的这样想:我先遍历题目所给的数组,在遍历的过程中,将每个数组中的每个元素与题目所给的那个...如果不相等的话,我就把那个元素赋值到我新建的数组中。 由于这个想法比较简单,这里我就不画图进行讲解了。...在仔细看一下条件,题目还说了数组的元素是非严格递增排列的。但是我们有前面移除数组元素题目做铺垫,这两道题的共性都在于删除元素。 那我们可以先用双指针法来尝试做一下这道题!...目的就是让我们合并它们,并且合并之后数组是按照非递减顺序排列的。 那该怎么做呢?我们在没有思路时,可以先去看一下题目给出的一些案例。...不过我相信有一个方法是大家都能想到的,这里我姑且叫它暴力破解法 方法1:暴力破解法 将两个有序数组合并成一个数组之后,在使用排序算法,将它变成有序的!没错这个方法的确可行。
总第116篇 前言 本篇开始,又会开始一个新的系列,数据结构,数据结构在算法或者是编程中的重要性不言而喻,所以学好数据结构还是很有必要的。...所以要看懂本系列,需要懂一些C语言基础,学python的也别着急,先掌握原理,之后会来一个python实现系列。...链表在插入和删除一个元素时,不需要移动大量元素,只需要更改插入位置的指针指向就可以。...分析:已知A、B中的元素递增有序,要使归并后的C中的元素依然有序,可以从A、B中挑出最小的元素插入C的尾部,这样当A、B中所有元素都插入C中时,C一定是递增有序的。...//更新指针r的指向 } r -> next = NULL; //直到r指针指向为NULL } 2.查找结点的算法 在双链表中查找值为
就像魔方一样,有很多种归位的方法,但是考虑到现在我们说的是DOM,是页面,如果我们move节点太多,那么DOM更新负担太重,整不好用户会看到页面闪烁,这显然不是我们要的效果。...最长递增子序列的用处 接下来我们要考虑获取最长递增子序列了,也就是LIS。这个LIS在Vue源码中由getSequence函数返回,具体算法我们稍等说,我们先说结果和LIS的用法。...Vue实际场景,和纯算法不一样的一点是,上面例子中[5,3,4,0]中的0是新增的节点,而我们要寻找的是更新节点中的不需要移动的节点,因此新增的节点不能加入LIS计算中。...那么,怎么换那个比arrI大的元素中最小的值呢,考虑到这里的lis是递增数组,很明显,用二分嘛~ 因此,这个时候,lis中left的位置需要更换为i。...所以在LeetCode300中可以这样二分完之后只修改left值就行了,但是在Vue中,还需要记录路径。
这是不需要的,后面我们会介绍C++,在C++中的STL中有现成的可以用,现在我们还没有介绍到,就复制我们写过的数据结构来做题 在做题过程中,我们也会计算这些方法的时间复杂度和空间复杂度,也是对之前内容的一个复习... 方法1的思路就是直接使用我们的顺序表,在顺序表中我们提供了查找方法,并且提供了删除指定位置元素的方法,我们就可以在顺序表中查找要删除的元素,然后把返回来的下标作为参数传给删除函数 首先我们把写过的顺序表拷贝到题目中...,空间复杂度为O(N) 我们知道这个时间复杂度和空间复杂度都不是很好,所以我们要接着介绍另一个方法 方法2(双指针) 这里的双指针不是创建两个指针变量,而是指数组中的下标,因为在数组中我们能够通过下标找到对应的元素...,与指针很像,所以叫双指针 具体方法就是创建两个整型变量src和dest,这两个名字在我们指针章节出现得不少,src代表源,dest代表目的地 在双指针算法中,我们的思路很简单,就是首先让...,用一个题来专门学习双指针算法,但是这三道题都使用了我们的双指针算法来解决,以后类似的题就可以使用双指针,效率是很高的 不知道友友们有没有收获什么新知识呢,欢迎在评论区留言,有问题欢迎直接私信我
索引用于访问数组中的元素。 数组元素(Element): 数组中的元素必须是相同类型的数据,可以是整数、浮点数、字符、对象等。 数组长度(Length): 数组的长度是指数组中包含的元素数量。...基本应用(Basic) 数组的结构本身比较简单,在解决常见面试算法问题中灵活应用数组索引来访问数据是关键。 Leetcode 26....双指针(Two Pointers) 一些资料上也有说双指针算法,笔者看来更倾向于是一种技巧,定义的两个索引指针 通过操作两个索引指针来获取问题答案。(PS:为什么这里叫指针?...指针更多的是C语言中的概念,最早C语言解决算法问题比较多。)...总结下 介绍了数组的基本结构,三个基本概念: 数组索引、数组元素、数组长度; 数组类基础题,关键在于灵活的三个基本概念; 利用操作两个数组索引的编程技巧来解决问题(双指针); 解决算法问题,求解C,可以先
快慢指针 今天我们将要来看另外一个基于数组的巧妙算法,叫做快慢指针算法,有些书中也叫做双指针算法。 双指针算法还算是一个比较大的范畴,理论上所有在数组当中使用到两个指针的算法都可以叫做双指针算法。...不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明: 为什么返回数值是整数,但输出的答案是数组呢?...那有没有办法不移动整个数组就完成覆盖呢?不难发现,我们要删除的元素只有一个,并且在最终的答案当中我们并不关心元素的顺序。...那么只要我们从数组后面的部分随便找到一个不等于val的元素进行覆盖是不是就可以了? 进而可以想到,我们可以维护两个指针,一个快一个慢,我们用l指代在左侧较慢的指针,用r指代在右侧较快的指针。...当r指针遍历到头时,说明已经没有可以交换的元素了,算法结束。
实际输出为: 因为for range创建了迭代对象每个元素的副本,而不是直接返回每个元素的引用,如果使用该值变量的地址作为指向每个元素的指针,就会导致错误,在迭代时,返回的变量是同一个迭代过程中根据切片依次赋值的变量...设计一种数据结构 满足:push、pop、getLast、getmax 在单链表中如何用最快的方法找到中间元素?...快慢指针 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?...如果数组没有排序,可以用 Partition 函数找出数组中的中位数。在没有排序的数组中插入一个数字和找出中位数的时间复杂度是 O(1)和 O(n)。...如果定义两个指针指向链表的中间结点(如果链表的结点数目是奇数,那么这两个指针指向同一个结点),那么可以在 O(1)时间得出中位数。此时时间效率与及基于排序的数组的时间效率一样。
前言 大家好,我是捡田螺的小男孩。收集了腾讯常考的十道算法题(真题)。在金三银四,希望对大家有帮助呀。...链表不支持下标访问,我们没办法随机访问到链表任意位置的元素,怎么办呢? 我们可以先遍历一下,用数组把链表的元素按顺序存储起来呀,然后就可以把它当做数组这么访问来用了对吧,最后重建下链表即可啦。...所以我们在思考原问题:数组num[i]的最长递增子序列长度时,可以思考下相关子问题,比如原问题是否跟子问题num[i-1]的最长递增子序列长度有关呢?...我们来画个图分析一波: 假设起点为A,入环点为B,快慢指针相遇点为C,慢指针走到相遇点为k步,B到C的距离为m。设环型周长为X。因为快指针速度是慢指针的2倍。...因此,快慢指针相遇后,慢指针回到起点,这时候快慢指针一样的速度走,相遇时,就是入环点啦,是不是无巧不成书呀,哈哈哈。
本次将详细介绍指针,是C语言中的一 个重要部分。 在程序中,指针提供强大而灵活的方法来操纵数据。...要熟悉你的计算机中变量类型的大小。在操纵指针和内存时必须要知道变量的大小。 不要用指针做乘法、除法运算。但是,可以用指针做加法(递增)和减法(递减)运算。 不要递增或递减数组变量。...在大多数情况下,还要传递数组中元素的个数。 在函数中,可以通过下标表示法或指针表示法,通过指针来访问数组元素。 警告:给函数传递一个普通变量时,传递的是该变量的副本。...函数使用的是真正的数组元素,因此可以在函数中修改储存在该数组中的值。 八:小结 本次介绍了C语言的重点内容一一指针。 指针是储存其他变量地址的变量。指针“指向”它所储存的地址上的变量。...函数一旦知道数组的地址和数组的元素个数,便可使用指针表示法或下标表示法访问数组元素。 问答题 1:为什么在C语言中,指针很重要? 通过指针能更好地控制数据。
领取专属 10元无门槛券
手把手带您无忧上云