算法
_MaL
少年二字应与平庸相斥
展开
-
--刷题日常
两个栈实现队列class MyQueue {public: stack<int> In; stack<int> Out; MyQueue() { } void push(int x) { In.push(x); } int pop() { if(Out.empty()) { while(!In.empty())原创 2021-12-01 23:42:50 · 209 阅读 · 0 评论 -
LeetCode: 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。1.暴力遍历匹配class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { for(auto &i:matrix) {原创 2021-10-25 20:30:03 · 132 阅读 · 0 评论 -
Leetode: 链表相交
题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。思路A长度为 a, B长度为b, 假设存在交叉点,此时 A到交叉点距离为 c, 而B到交叉点距离为d后续交叉后长度是一样的,那么就是 a-c = b-d -> a+d = b+c这里意味着只要分别让A和B额外多走一遍B和转载 2021-10-19 21:21:12 · 90 阅读 · 0 评论 -
LeetCode: 删除链表的倒数第 N 个结点
题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?思路:快慢指针,快指针先走n步,然后一起到结尾,慢指针所指的即为倒数第n个节点。class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { //if(head == nullptr || head->next == nullptr) return head;原创 2021-10-19 20:13:18 · 94 阅读 · 0 评论 -
LeetCode:两两交换链表元素
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换思路:class Solution {public: ListNode* swapPairs(ListNode* head) { ListNode *vcur = new ListNode(0); vcur->next = head; ListNode*cur = vcur;原创 2021-10-19 18:36:17 · 260 阅读 · 0 评论 -
LeetCode: 反转链表
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表class Solution {public: ListNode* reverseList(ListNode* head) { return reverse(nullptr,head); } ListNode* reverse(ListNode* pre,ListNode*cur) { if(cur == nullptr) return pre;原创 2021-10-19 16:00:49 · 97 阅读 · 0 评论 -
LeetCode: 移除链表元素
题目:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点class Solution {public: ListNode* removeElements(ListNode* head, int val) { while(head != nullptr && head->val == val)//删除头节点 { ListNode*tm原创 2021-10-19 15:42:39 · 99 阅读 · 0 评论 -
LeetCode: 最长不含重复字符的子字符串
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列原创 2021-09-23 13:57:54 · 159 阅读 · 0 评论 -
LeetCode: 链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.思路:快慢指针struct ListNode { int val; ListNode* next; ListNode原创 2021-09-22 20:25:53 · 104 阅读 · 0 评论 -
Leetcode: 买卖股票的最佳时机
题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是原创 2021-09-15 23:37:10 · 120 阅读 · 0 评论 -
Leetcode: 旋转数组
题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步:[7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释:向右旋转 1 步: [9原创 2021-09-15 22:24:46 · 90 阅读 · 0 评论 -
Leetcode:有序数组的平方
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]示例 2:输入:nums = [-7,-3,2,3,11]输出:[4,9,9,49,121]提示:1 <= nums.length <= 104-104 &原创 2021-09-15 20:46:52 · 88 阅读 · 0 评论 -
Leetcode: 爬楼梯
题目:数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。示例 1:输入:cost = [10, 15, 20]输出:15解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15。示例 2:输入:cost原创 2021-09-15 19:24:25 · 99 阅读 · 0 评论 -
Leetcode: 第 N 个泰波那契数
题目:泰波那契序列 Tn 定义如下:T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2给你整数 n,请返回第 n 个泰波那契数 Tn 的值。示例 1:输入:n = 4输出:4解释:T_3 = 0 + 1 + 1 = 2T_4 = 1 + 1 + 2 = 4示例 2:输入:n = 25输出:1389537提示:0 <= n <= 37答案保证是一个 32 位整数,即 answer原创 2021-09-15 18:06:55 · 104 阅读 · 0 评论 -
Leetcode: 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符数值I1V5X10L50C100D500M1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数原创 2021-09-14 19:23:32 · 147 阅读 · 0 评论 -
Leetcode: 最长公共前缀
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入:strs = [“flower”,“flow”,“flight”]输出:“fl”示例 2:输入:strs = [“dog”,“racecar”,“car”]输出:""解释:输入不存在公共前缀提示:1 <= strs.length <= 2000 <= strs[i].length <= 200strs[i] 仅由小写英文字母组成string原创 2021-09-13 17:03:20 · 84 阅读 · 0 评论 -
Leetcode: 查找插入位置
题目:给定一个排序的整数数组 nums 和一个整数目标值 target ,请在数组中找到 target ,并返回其下标。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], target = 7输出: 4原创 2021-09-12 17:46:12 · 104 阅读 · 0 评论 -
leetcode: 用 Rand7() 实现 Rand10()
题目:已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。示例 1:输入: 1输出: [7]示例 2:输入: 2输出: [8,4]示例 3:输入: 3输出: [8,1,10]提示:rand7 已定义。传入参数: n 表示 rand10 的调用次数。思路:RandNN= N( RandN()-1 ) + RandN() ;// 生成1到原创 2021-09-09 17:46:38 · 95 阅读 · 0 评论 -
leetcode 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-integer。示例 1:输入:x = 123输出:321示例 2:输入:x = -123输出:-321示例 3:输入:x = 120输出:21示例 4:输入:x = 0输出:0原创 2021-09-05 21:20:10 · 75 阅读 · 0 评论 -
剑指 Offer 25 合并两个排序的链表
题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * L原创 2021-09-05 13:41:10 · 81 阅读 · 0 评论 -
LeetCode刷题 | 青蛙跳台阶问题
问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2 输出:2示例 2:输入:n = 7 输出:21示例 3:输入:n = 0 输出:1提示:0 <= n <= 100解法一:斐波拉契数列,f(n) = f(n-1)+f(n-2)int numWays(int n){ if (n原创 2021-03-29 00:13:53 · 235 阅读 · 0 评论 -
LeetCode刷题 | 唯一元素的和
题目:给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。请你返回 nums 中唯一元素的 和 。示例 1:输入:nums = [1,2,3,2] 输出:4 解释:唯一元素为 [1,3] ,和为 4 。示例 2:输入:nums = [1,1,1,1,1] 输出:0 解释:没有唯一元素,和为 0 。示例 3 :输入:nums = [1,2,3,4,5] 输出:15 解释:唯一元素为 [1,2,3,4,5] ,和为 15 。提示:1 <= nums原创 2021-03-28 20:24:33 · 1116 阅读 · 0 评论 -
算法 利用库函数对数据进行排序
根据算法可以自己实现一个或者利用库函数,对数据进行排序.示例1:输入:arr=[8,4,2,1,3]输出:[1,2,3,4,8]算法1:利用C语言库函数qsort(快速排序)进行排序//实现整型的比较函数 int Int_cmp(const void*vp1,const void *vp2) { return *(int*)vp1-*(int*)vp2; } void quickSort(int *arr,int len) {原创 2020-10-24 18:32:37 · 203 阅读 · 0 评论 -
算法 所有奇数长度子数组的和
给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。子数组定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。示例 1:输入:arr = [1,4,2,5,3]输出:58解释:所有奇数长度子数组和它们的和为:长度为1的子数组有[1],[4],[2],[5],[3] ,相加结果为15长度为3的子数组有[1,4,2],[4,2,5],[2,5,3],相加的结果为7+11+10=28长度为5的子数组有[1,4,2,5,3] ,相加的结果为15我们将所原创 2020-10-24 18:27:22 · 497 阅读 · 0 评论 -
算法 1~n中1的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6原题出处:https://leetcode-cn.com/problems/number-of-digit-one/算法1:把每个数字中包含1的数量计算出来,然后把1~n的1的数量全部加起来(效率低)int NembOf1(int n){ int an原创 2020-10-24 18:18:33 · 519 阅读 · 0 评论 -
算法 整数的各位积和之差
给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。示例 1:输入:n = 234输出:15解释:各位数之积 = 2 * 3 * 4 = 24各位数之和 = 2 + 3 + 4 = 9结果 = 24 - 9 = 15示例 2:输入:n = 4421输出:21解释:各位数之积 = 4 * 4 * 2 * 1 = 32各位数之和 = 4 + 4 + 2 + 1 = 11结果 = 32 - 11 = 21算法:累积累和做差int Fun(int原创 2020-10-24 18:01:02 · 738 阅读 · 0 评论 -
算法 IP地址无效化
给你一个有效的 Ipv4地址 ,返回这个 IP 地址的无效化版本。所谓无效化 IP 地址,其实就是用 “[.]” 代替了每个 “.”。示例 1:输入:address = “1.1.1.1”输出:“1[.]1[.]1[.]1”示例 2:输入:address = “255.100.50.0”输出:“255[.]100[.]50[.]0”算法1:遍历字符串,遇到’.’进行替换char* defangIPaddr(char* address){ char* tmp = (char*)ma原创 2020-10-24 17:58:37 · 185 阅读 · 0 评论 -
算法 特殊进制的位数
给定一个正整数,如果把它转为十六进制,那么它是个几位数字呢?示例 1:输入:12345678输出:6解释:12345678转成十六进制为0x BC614E,即6位.示例 2:输入:0x12345678输出:8示例 3:输入:0X12AB34输出:6算法:在计算机中,数都是二进制码的形式存储。由十进制数统计位数/10可以知道,十六进制也可以这样处理,每次丢弃十六进制的”个位”,直到0,统计丢弃的次数即可.其它进制的处理过程类似.int NumOf0X(int n){ i原创 2020-10-24 17:53:06 · 692 阅读 · 0 评论 -
算法 统计十进制数字位数[循环],正序,逆序输出该数字的每一位
(1)统计十进制数字位数[循环]统计一个整数是个几位数字?整数可以是负数,零或者正数.*示例 1:输入:0输出:1示例 2:输入:123456789输出:9示例 3:输入:-123456789输出:9算法:每次丢弃个位数字,直到0,统计丢弃的次数即可int NumofIntBit(int n){ int ans = 0; if (n == 0) { ans = 1; } while (n != 0) { n = n / 10; ans++; }原创 2020-10-24 17:43:51 · 688 阅读 · 0 评论 -
算法 求平方根[循环]
给你一个正整数,求出其正平方根的值,如果其正平方根的值不为整数则取其整数部分.不允许使用库函数.示例 1:输入:9输出:3示例 2:输入:10输出:3算法:二分法求平方根,类似于折半查找思想,不断缩小查找区间,i^2 >n &&(i-1)^2<n时,算术平方根为i-1;double sqrt1(double x) { double EPS = 0.00000001; double low = 0.0; double high = x; double原创 2020-10-24 17:07:03 · 868 阅读 · 0 评论 -
算法 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3算法一:双循环查看当前数字在后面的数字中是否存在,如果存在则找到,如果不存在则继续找下一个,直到结束。时间复杂度O(n^2),空间复杂度O(1) int FindRepeatNumber(int* nums, int numsSize)原创 2020-10-18 16:25:25 · 215 阅读 · 0 评论 -
算法 将数字变成 0 的操作次数
给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。示例 1:输入:num = 14输出:6解释:步骤 1) 14 是偶数,除以 2 得到 7 。步骤 2) 7 是奇数,减 1 得到 6 。步骤 3) 6 是偶数,除以 2 得到 3 。步骤 4) 3 是奇数,减 1 得到 2 。步骤 5) 2 是偶数,除以 2 得到 1 。步骤 6) 1 是奇数,减 1 得到 0 。示例 2:输入:num = 8输出:原创 2020-10-18 16:18:56 · 466 阅读 · 0 评论 -
算法 拿硬币
桌上有 n 堆硬币,每堆的数量保存在数组 arr 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有硬币的最少次数。示例 1:输入:[4,2,1]输出:4解释:第一堆硬币币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。示例 2:输入:[2,3,10]int TakeCoin(vector& coin){int cnt = 0;for (auto c : coin){cnt += c / 2; // 前几次都原创 2020-10-16 23:55:54 · 914 阅读 · 0 评论 -
算法 宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = “aA”, S = “aAAbbbb”输出: 3示例 2:输入: J = “z”, S = “ZZ”输出: 0注意:S 和 J 最多含有50个字母。J 中的字符不重复。来源:力扣(LeetCode) 771原创 2020-10-16 23:39:01 · 180 阅读 · 0 评论 -
算法 猜数字
小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。示例 1:输入:guess = [1,2,3], answer = [1,2,3]输出:3解释:小A 每次都猜对了。示例 2:输入:guess = [2,2,3], answer = [3,2,1]原创 2020-10-16 23:20:21 · 351 阅读 · 0 评论 -
算法 数列异或操作
给你两个整数,n和start,其中n为数据的数量,start为第一个数据。当前数据定义为:num = start + 2*i(i表示第几个数据,从0开始)。请返回数列中所有数据按位异或(XOR)后得到的结果.示例 1:输入:n = 5, start = 0输出:8解释:数列为 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。"^" 为按位异或运算符。示例 2:输入:n = 4, start = 3输出:8解释:数列为 [3, 5, 7, 9],其原创 2020-10-16 23:14:29 · 431 阅读 · 0 评论 -
算法 重新排列数组
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。示例 1:输入:nums = [2,5,1,3,4,7], n = 3输出:[2,3,5,4,1,7]解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]示例 2:输入:nums = [1,2,3,4,4,3,2,1],原创 2020-10-16 23:08:29 · 437 阅读 · 0 评论 -
算法 好数对的数量
给你一个整数数组 nums 。如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组好数对。返回好数对的数目。示例 1:输入:nums = [1,2,3,1,1,3]输出:4解释:有 4 组好数对,分别是 (0,3), (0,4), (3,4), (2,5) ,下标从 0 开始示例 2:输入:nums = [1,1,1,1]输出:6解释:数组中的每组数字都是好数对示例 3:输入:nums = [1,2,3]输出:0原创 2020-10-16 22:49:04 · 213 阅读 · 0 评论 -
算法 一维数组前缀和
给你一个数组 nums 。数组「前缀和」的计算公式为:rtSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的前缀和示例 :输入:nums = [1,2,3,4]输出:[1,3,6,10]解释:前缀和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。解法一:额外定义一个数组,用于存放每一项的前缀和int PreSum1(int *arr,int *Sum,int arr_length) //o(n) o(n){ if(arr_length &原创 2020-10-16 22:41:48 · 642 阅读 · 0 评论 -
KMP算法
KMP算法:运用于字符串匹配思想图解:KMP算法相比于BF算法要快得多,时间复杂度为O(m+n)代码:#include<stdio.h>#include<string.h>#include<assert.h>#include<stdlib.h>void Getnext(int *next,const char *sub){ ...原创 2019-09-29 18:40:36 · 1495 阅读 · 0 评论