算法基础课
Acwing算法基础课题解
马踏飞燕&lin_li
博客地址以迁移:https://linli1724647576.github.io/
展开
-
第七章:二分搜索与贪婪
二分搜索与贪婪二分搜索递归写法非递归写法剑指 Offer 53 - I. 在排序数组中查找数字 I统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0class Solution {public: int SearchLowBounder(vector<int>& nums,i原创 2021-03-29 22:03:50 · 98 阅读 · 0 评论 -
第六章 动态规划
第六章 动态规划leetcode 300 最长子序列长度class Solution {public: int lengthOfLIS(vector<int>& nums) { int max = 0; int f[nums.size()]; for(int i=0;i<nums.size();i++){ f[i] = 1; for(int j=0;j<i;j++原创 2021-03-29 21:19:37 · 88 阅读 · 0 评论 -
第五章 深度与广度优先搜索(下)
第五章 深度与广度优先搜索(下)二、广度优先搜索剑指 Offer 13. 机器人的运动范围class Solution { int **board; int k,m,n; queue<pair<int,int>> Q;public: bool isaccess(int m,int n){ //判断到达条件 if(m%10 + m/10 + n%10 + n/10 > k) return false;原创 2021-03-21 10:00:24 · 80 阅读 · 0 评论 -
第五章 深度与广度优先搜索(上)
第五章 深度与广度优先搜索一、深度优先搜索例题:寻找最短路径:剑指 Offer 12. 矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],["s","f","c","s"],["a",原创 2021-03-21 00:02:53 · 104 阅读 · 0 评论 -
leetcode 28. 实现 strStr() --KMP算法
28. 实现 strStr()实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例 1:输入: haystack = "hello", needle = "ll"输出: 2示例 2:输入: haystack = "aaaaa", needle = "bba"输出: -1说明:当 needle 是空字符串时,我们应当返回什么值原创 2021-01-27 11:10:19 · 186 阅读 · 0 评论 -
第四章 排序(下)
第四章 排序(下)四、快速排序215. 数组中的第K个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4class Solution {public: int findKthLargest(vector<int>&am原创 2020-08-02 22:31:09 · 89 阅读 · 0 评论 -
第四章 排序(上)
第四章 排序(上)一、冒泡排序leetcode912. 排序数组给你一个整数数组 nums,请你将该数组升序排列。示例 1:输入:nums = [5,2,3,1]输出:[1,2,3,5]示例 2:输入:nums = [5,1,1,2,0,0]输出:[0,0,1,1,2,5]冒泡排序解法,超出时间限制class Solution {public: vector<int> sortArray(vector<int>& nums) {原创 2020-08-01 21:31:58 · 129 阅读 · 1 评论 -
第三章 递归与回溯(下)
第三章 递归与回溯(下)二、回溯leetcode39. 组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。 示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[ [7], [2,2,3]]原创 2020-08-01 11:41:15 · 108 阅读 · 1 评论 -
第三章 递归与回溯(上)
第三章 递归与回溯(上)一、递归leetcode91. 解码方法一条包含字母 A-Z 的消息通过以下方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF"原创 2020-07-31 21:06:47 · 156 阅读 · 0 评论 -
第二章 高级数据结构
第二章 高级数据结构一、优先队列初始化大小为n的堆时间复杂度是O(n)leetcode347. 前 K 个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]存储词频的最佳数据结构是哈希表,将单词和词频构成的对象构造出一个优先队列,解前k个的题目时,关键是看如何定义优先级别,以及优先队列的数据结构。cl原创 2020-07-31 18:16:29 · 224 阅读 · 0 评论 -
第一章 常用的数据结构(下)
第一章 常用的数据结构四、队列双端队列leetcode 239. 滑动窗口最大值给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大原创 2020-07-30 21:28:49 · 121 阅读 · 0 评论 -
第一章 常用的数据结构(上)
第一章 常用的数据结构一、数组和字符串leetcode242给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false思路:可以用两个长度为26的数组,分别统计每个字符出现的个数,也可以利用一个长度为26的数组,出现在s的字符+1,出现在t的字符-1,最后判断数组是否为0.class Sol原创 2020-07-29 22:14:20 · 144 阅读 · 0 评论 -
数的三次方根
数的三次方根给定一个浮点数n,求它的三次方根。输入格式共一行,包含一个浮点数n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。数据范围−10000≤n≤10000输入样例:1000.00输出样例:10.000000浮点数二分模板bool check(double x) {/* ... */} // 检查x是否满足某种性质double bsearch_3(double l, double r){ const double eps = 1e-原创 2020-06-25 21:47:10 · 619 阅读 · 1 评论 -
搜索旋转排序数组
搜索旋转排序数组来源Leetcode假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5,原创 2020-06-25 11:32:47 · 115 阅读 · 0 评论 -
数的范围(二分查找)
数的范围(二分查找)给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式共q行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回“-1 -1”。数据范围1≤原创 2020-06-25 09:14:10 · 1381 阅读 · 0 评论 -
归并排序(模板题)
归并排序(模板题)给定你一个长度为n的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5代码模板void merge_sort(int q[], int l, int r){原创 2020-06-25 07:43:37 · 374 阅读 · 0 评论 -
第K个数
第K个数给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。输出格式输出一个整数,表示数列的第k小数。数据范围1≤n≤1000001≤k≤n输入样例:5 32 4 1 5 3输出样例:3代码代入快排模板#include<stdio.h>#include<iostream>using namespa原创 2020-06-24 23:01:53 · 196 阅读 · 0 评论 -
快速排序(模板题)
快速排序(模板题)Acwing 785给定你一个长度为n的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5快排模板void quick_sort(int q[], int l, i原创 2020-06-24 16:19:18 · 555 阅读 · 0 评论