
每日一题
文章平均质量分 71
为了面试算法,简单版,不是原题
仍有未知等待探索
追寻答案
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
每日一题:二分查找
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]输入:nums = [], target = 0输出:[-1,-1]原创 2024-10-03 01:42:27 · 801 阅读 · 0 评论 -
每日一题:⻓度最⼩的⼦数组
纯暴力的话,就是用两个循环变量,代表一个区间的左端点和右端点,然后再用一个指针去循环这个区间得到这个区间的区间和。其实是不需要的,因为当区间和大于等于target的时候,我们将左边界向右移动,这时该区间和一定小于之前,我们只需要继续往右移动。我们在双重循环之前先求出该数组的前缀和,这样的话获得区间和的操作就是O(1)根据上面的步骤,我们真的需要每次都需要j从i的位置开始遍历吗?我们通过优化掉两个循环中的获取区间和的循环,降低了一层循环。时间复杂度:O(n³)时间复杂度:O(n²)时间复杂度:O(n)原创 2024-09-26 21:40:31 · 488 阅读 · 0 评论 -
每日一题:三数之和、四数之和
我们需要先将这个数组从小到大排序,然后定义三个嵌套循环i、j、k,让每个循环变量的初始值等于上一个循环变量+1的值。然后将满足条件的i,j,k下标对应的数添加到set里面进行去重。首先,我们对这个数组进行排序,那这个数组就会有单调性。假如我们先固定一个数a,假设这个数是答案的一部分,然后再去寻找另外两个数的和是0 - a。这个也和三数之和的双指针算法类似,唯一不同的就是需要用到两个for循环进行固定数,然后用一个双指针算法查找剩余数。同样的有四个嵌套for循环来进行遍历,找到答案,然后用set进行去重。原创 2024-09-20 13:31:57 · 488 阅读 · 0 评论 -
每日一题:移动零
我们先不考虑用什么算法进行解答,如果只用朴素法的话,我们肯定是先从左往右找到第一个零元素和第一个非零元素,然后将这两个数据进行交换,然后接着往后找到第二个零元素和非零元素进行交换,直到指向零元素的指针指向了数组的尾部结束。有题目可以知道,这个主要是让我们将这个数组中的零和非零元素进行分离,并且保证非零元素的相对顺序。= 0的时候,交换dest+1和cur位置的元素。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。当num[cur] == 0的时候,不做处理。原创 2024-09-12 00:09:06 · 407 阅读 · 0 评论 -
莫队算法,
莫队算法就是一个离线的,通常针对于区间询问的一种算法。原创 2024-04-04 15:45:08 · 313 阅读 · 0 评论 -
C/C++ h0138. 疯牛
通过题目看,这就是一个二分+贪心的题目。 通过二分来找相邻两头牛间的距离,然后每二分一次,就判断一次摊位是否能放得下c头牛。原创 2024-02-02 08:28:41 · 838 阅读 · 0 评论 -
LeetCode:376.摆动序列
其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8)。仅有一个元素或者含两个不等元素的序列也视作摆动序列。可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。我们只需要记录每段是上升的还是下降的,然后如果连续的两个序列不同的话,就进行记录。整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3)。我们要求摆动序列的最大子序列(可以进行删除操作,创造子序列)原创 2024-01-27 14:25:05 · 635 阅读 · 2 评论 -
C/C++ LeetCode:跳跃问题
区间覆盖,我们可以每次移动一位的时候就进行一次区间覆盖的估计,然后将区间覆盖最大的来更新旧的,如果区间将数组的最后一个元素覆盖了之后,就证明我们肯定能保证能存在一个最短的路径,使得步数最小。数组的第一个元素是2,那我们是不是要往后移动2个元素,才能保证步数最短呢?显然不是,如果我们直接往后移了2位,是比只移了1位的距离远(从下标为 0 跳到下标为 1 的位置,跳 1步,然后跳 3 步到达数组的最后一个位置。可是每一步都尽可能的大,这句话可能会有一些歧义。题目让我们来解答如何才能在最短的步数内到达终点。原创 2024-01-26 21:00:10 · 501 阅读 · 0 评论 -
C/C++ 表达式求值(含多位数)
表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼了大脑的思维和对代码的调试能力。如果是在纸上给一个计算表达式,你一定可以算出来,但是要用代码实现的时候就会感觉没什么思路了,接下来就来看我给你“操作一番”!原创 2023-12-13 22:27:20 · 2337 阅读 · 39 评论 -
C/C++十大排序之一———归并排序(递归写法)(C/C++)
归并排序和这个引例的方法很相似,给你一个无序的数组,让你排序的话,你可以先把他进行几次分割,变成几个有序的数组然后在进行合并,那这样的话,进行几次分割能把无序的数组变成几个有序的数组呢?(只不过这个数组里就存了一个数而已)那就好办多了,把他们拆成一个一个的数然后进行比较。首先要拿出数组a中的第一个元素和数组b中的第一个元素进行比大小,把小的元素放在一个接收合完并的新数组里面。例如:12),故将2放在1的后面,如此进行下去。归并排序讲究的是分而治之的思想。原创 2023-07-22 17:25:54 · 334 阅读 · 4 评论 -
C/C++ 整数二分以及浮点数二分
/k为查找的数while (i+1!return i;return 0;//k为查找的数while (i+1!return i;return 0;原创 2023-12-03 23:03:39 · 833 阅读 · 35 评论 -
C/C++ 快速排序
一、引言快速排序的思想——分治一、引言快速排序是对冒泡排序的一种改进。它的基本思想在于划分,首先选一个基准x,让x的左边都小于x,让x的右边都大于x。然后通过递归,一直将数组分成两个或一个元素。二、讲解1、步骤1、将确定分界点。2、调整范围——让基准x的左边都小于x,让x的右边都大于x。3、递归分治。如果arr数组为:【0,1】基准点为左边界。因为i先自增,arr[0]==0,退出循环.。j先自减,arr[j]>0,继续进入循环,j--,arr[j]==0,退出循环。原创 2023-12-02 00:18:37 · 646 阅读 · 35 评论 -
C/C++ 递归指数型枚举
之前进行枚举的时候,都是进行暴力枚举的策略,将所用可能性都枚举一遍以获得最优解,但是枚举全部元素的效率如同愚公移山,无法应付数据范围稍大的情形。其算法的主要策略是跳过一些无效状态,降低问题的规模。原创 2023-11-22 20:37:31 · 594 阅读 · 49 评论 -
C/C++高精度
为什么需要高精度算法?因为在某些情况下数据太大,基本的数据类型不能够进行存储,所以需要高精度算法来进行运算。原创 2023-11-18 22:55:13 · 613 阅读 · 63 评论