
算法就是武!装!色!霸!气!
文章平均质量分 65
在战斗中总结与成长,练就自己的流樱吧!
Lafitteee拉菲
这个作者很懒,什么都没留下…
展开
-
【位运算】剑指offer 56. 数组中数字出现的次数
【位运算】剑指offer 56. 数组中数字出现的次数这是一系列位运算的题目,先从最简单的问题开始,循序渐进,逐渐深入:问题1:一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字。要求时间复杂度是 O(n)O(n)O(n),空间复杂度是 O(1)O(1)O(1)。解法:考虑到位运算中的异或运算,一个数字和它自己做异或,结果为0。所以只需要遍历整个数组,挨个异或,出现两次的数字会被抵消为0,最后得到的结果就是那个只出现1次的数字。class Solution {原创 2022-04-12 11:08:16 · 1276 阅读 · 1 评论 -
【优先队列 堆】剑指 Offer 41. 数据流中的中位数
剑指 Offer 41. 数据流中的中位数将数据分为两半,较小的一半用大顶堆存放,较大的一半用小顶堆存放。当前数据总数为 cntcntcnt ,这样当一个新的数据 numnumnum 进来时,考虑下面两种情况:cnt % 2==0cnt\ \%\ 2 == 0cnt % 2==0 :先将 numnumnum 压入小顶堆,然后将小顶堆堆顶元素压入大顶堆,最后 poppoppop 掉小顶堆堆顶元素;这种情况时,两个堆内的元素数量相同,那么加入新元素后,前半段原创 2022-04-09 14:51:29 · 375 阅读 · 0 评论 -
Leetcode 5. 最长回文子串--动态规划与中心扩展
5. 最长回文子串题目描述给你一个字符串 sss ,找到 sss 中的最长回文子串。示例:输入:s = "babad"输出:"bab"解释:"aba"同样是符合题意的答案。解答动态规划回文串天生自带状态转移的属性,对于一个回文串来说,去掉两头的字符,剩余部分必定也是一个回文串;同样的,如果一个字符串两端的字符不相等,那么这个字符串必定不是一个回文串。因此考虑动态规划。令 dp[i][j]dp[i][j]dp[i][j] 表示字符串 s[i:j]s[i:j]s[i:j] 是否是一原创 2022-03-19 21:29:26 · 916 阅读 · 0 评论 -
剑指Offer II.079. 080. 081.082.回溯专题(一)
算法之于程序员,就像武装色霸气之于海贼。修炼强大的武装色霸气,才能保护我想保护,成就我想成就。原创 2022-02-21 23:25:15 · 328 阅读 · 0 评论 -
剑指offer II 077、078 归并排序(有待加强)
剑指 Offer II 077. 链表排序题目描述思路:题目进阶要求 O(nlogn)O(nlogn)O(nlogn) 的时间复杂度,那么这里正好复习一下排序算法的时间复杂度:O(n2)O(n^2)O(n2) 级别:选择排序、插入排序、冒泡排序;O(nlogn)O(nlogn)O(nlogn) 级别:堆排序、快速排序、归并排序;因此考虑堆排序、快速排序、归并排序中的一个。其中堆排序和快速排序都需要元素的随机访问,对于链表来说不合适。只能考虑归并排序。方法一:最简单想到的归并排序就是自顶原创 2022-02-17 17:06:49 · 571 阅读 · 2 评论 -
剑指 Offer II 076. 数组中的第 k 大的数字 (用堆来解决topK问题)
剑指 Offer II 076. 数组中的第 k 大的数字 (用堆来解决topK问题)题目描述解题思路这道题是一个很基础也很经典的 topK 问题。借此机会,顺便整理一下堆排序的写法。首先是调整堆的结构以及建堆的代码,以大顶堆为例://调整堆的结构使其满足根节点大于等于其孩子节点void maxHeapify(vector<int>& a, int i, int heapSize) { int left = i * 2 + 1, right = i * 2 + 2;原创 2022-02-16 00:42:51 · 329 阅读 · 0 评论 -
剑指 Offer II 075. 数组相对排序(自定义排序、计数排序)
剑指 Offer II 075. 数组相对排序(自定义排序、计数排序)题目描述方法一:最简单最容易想到的方法用一个map<int, int> mp记录arr1中的每个数字出现的次数遍历arr2的同时,向答案数组ans中循环添加arr2[i],循环次数为arr1中出现的次数,同时用一个变量cnt记录所有出现的次数总和。即mp[arr2[i]],遍历结束时arr1中出现在arr2中的数字就有序了用一个set<int> st存储arr2中的数字,遍历arr1,如果不曾出现在s原创 2022-02-15 15:37:06 · 625 阅读 · 0 评论 -
剑指 Offer II 074. 合并区间(排序,数组)
题目描述一道简单的合并区间问题。题目传送门解题思路两个区间如果能合并,一定是有交集,也就是第二个区间的头在第一个区间内,这样就想到了先对所有区间进行排序,然后用一个数组tmp[]记录当前区间的起始点。初始时起始点设为第一个区间intervals[0]的起始点,然后遍历所有区间:如果当前区间intervals[i]的起点在tmp[0]和tmp[1]之间,也就是与当前记录的合并区间tmp有交集,那么就合并两个区间,把tmp[1]的值修改为max(tmp[1], intervals[i][1])(这里原创 2022-02-15 13:43:12 · 314 阅读 · 0 评论 -
第280场周赛Problem2:使数组变成交替数组的最少操作数
题目描述使数组变成交替数组的最少操作数思路最少的调整操作,意味着我们分别把奇(偶)数下标位的数字调整为所有奇(偶)数下标位数字中出现次数最多的数字,这样的调整次数会最少。同时又不能让奇偶下标位的数字是相同的。比赛的时候想到了这个思路,但是在做的过程中感觉越做越麻烦,对自己的思路也越来越不清晰,越来越不自信,导致没有做出来。希望吸取教训,在做题的过程中树立道路自信、理论自信(咳咳…过程:用两个哈希表mp_0和mp_1分别记录奇偶位置上每个数字的出现次数;把两个哈希表中的键值对按值排序,分别得原创 2022-02-14 11:41:07 · 687 阅读 · 0 评论 -
Leetcode47.全排列II
题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。思路排列的问题就用回溯。由于nums数组中可能有相同的数字,所以在全排列时会出现重复的排列。这就需要剪枝。思路如下:首先将nums数组进行排序,让相同的数字紧邻;然后在递归填入数字的过程中每次都需要遍历vis数组来查找未被使用过的数字,这样我们只寻找未被使用的数字中的第一个,例如nums = [1, 1, 2],当第一个1开头的所有排列情况都被找到后,开始寻找第二个1开头的排列,这时的vis = [0, 0,原创 2021-10-28 15:59:44 · 149 阅读 · 0 评论 -
1338. 数组大小减半
1338. 数组大小减半题目连接给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。返回至少能删除数组中的一半整数的整数集合的最小大小。题解思路: 只需要记录每个元素在arr中出现的次数,将次数排序,从出现次数最多的数开始删除,累加被删除的数出现的次数,直到大于等于arr的长度的一半。不需要真的删除数据,只需要记录被删除的数据出现的次数即可。clas...原创 2020-05-02 10:30:45 · 247 阅读 · 0 评论 -
1382. 将二叉搜索树变平衡
1382. 将二叉搜索树变平衡题目连接题目给出一个二叉搜索树,要求输出平衡后的二叉树。利用二叉搜索树的性质,中序遍历序列是一个有序序列。然后取中序序列的中间元素作为根结点,左侧为左子树,右侧为右子树,递归建立平衡二叉树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * ...原创 2020-05-02 10:04:24 · 187 阅读 · 0 评论