【算法】
算法
paradox_1_0
自由、努力、向上。
展开
-
leetcode刷题.1030. 距离顺序排列矩阵单元格.每日打卡
代码:class Solution1030_easy {public: struct Point { Point(int x, int y) : x_(x), y_(y) { } int x_; int y_; }; vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) { vector<vector<int>> dirs{ {1, 0},..原创 2020-11-17 19:07:14 · 194 阅读 · 0 评论 -
leetcode刷题.402. 移掉K位数字.每日打卡
代码:(应该可以写的更加优雅一些)class Solution {public: string minNumberString(string num, int lefts) { /* 如果预留0长度,则返回空 */ if(0 == lefts) return ""; /* 剩下的字符串长度和预留字符相等,则不能再剔除字符串,直接返回整个字符串 */ if(num.length() ..原创 2020-11-15 14:46:31 · 154 阅读 · 0 评论 -
leetcode刷题.328. 奇偶链表.每日打卡
代码:class Solution328_medium {public: ListNode* oddEvenList(ListNode* head) { if (nullptr == head || nullptr == head->next) return head; ListNode* odd_head = head, * odd = head; ListNode* even_head = head->next, * even = head->nex..原创 2020-11-14 13:34:49 · 172 阅读 · 0 评论 -
leetcode刷题.31. 下一个排列.每日打卡
代码:class Solution41_meduim {public: void nextPermutation(vector<int>& nums) { if (nums.empty()) return; int subMax = nums[nums.size() - 1]; for (int i = nums...原创 2020-11-10 19:33:37 · 171 阅读 · 0 评论 -
leetcode刷题.973. 最接近原点的 K 个点.每日打卡
采用优先队列(即大顶堆)的方法:代码:class Solution973_medium {public: vector<vector<int>> kClosest(vector<vector<int>>& points, int K) { int index = 0; vector<vector<int>> out..原创 2020-11-09 19:39:41 · 174 阅读 · 0 评论 -
leetcode刷题.127. 单词接龙.每日打卡
bfs的经典题目:代码:class Solution {public: int ladderLength(string beginWord, string endWord, vector<string>& wordList) { int minLength = INT_MAX; // 构造图的邻接举证表示 unordered_map<string, vec..原创 2020-11-07 15:40:03 · 245 阅读 · 0 评论 -
leetcode刷题.1356. 根据数字二进制下 1 的数目排序.每日打卡
思路很简单:代码:class Solution1356_easy {public: vector<int> sortByBits(vector<int>& arr) { vector<int> hanmminNums(arr.size()); for (int i = 0; i < arr.size(); i++) ..原创 2020-11-07 13:49:24 · 194 阅读 · 0 评论 -
leetcode刷题.47. 全排列二.每日打卡
方法:回溯 + 剪枝代码:(还可以有优化空间)class Solution47 {public: vector<vector<int>> permuteUnique(vector<int>& nums) { /* 做一个排序 */ sort(nums.begin(), nums.end()); return recursion(nums);原创 2020-11-04 20:33:01 · 183 阅读 · 0 评论 -
leetcode刷题.57. 插入区间.每日打卡
思路非常简单,代码:class Solution {public: vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) { int left = newInterval[0]; int right = newInterval[1]; vector<vector<int>&..原创 2020-11-04 19:20:36 · 822 阅读 · 1 评论 -
leetcode刷题.140. 单词拆分 II.每日打卡
回溯法 + 记忆化代码:class Solution140_hard {public: vector<string> wordBreak(string s, vector<string>& wordDict) { if (s.empty()) return {}; unordered_set<string> word...原创 2020-11-01 02:50:57 · 171 阅读 · 0 评论 -
leetcode刷题.381. O(1) 时间插入、删除和获取随机元素 - 允许重复。每日打卡
代码:class RandomizedCollection381_hard {public: /** Initialize your data structure here. */ RandomizedCollection381_hard() { } /** Inserts a value to the collection. Returns true if the collection did not already cont..原创 2020-10-31 17:58:14 · 208 阅读 · 0 评论 -
leetcode刷题.530. 二叉搜索树的最小绝对差.每日打卡
class Solution {public: int threeMin(int a, int b, int c) { return (a > b) ? ((b > c) ? c : b) : ((a > c) ? c : a); } int maxTreeNode(TreeNode *root) { while(nullptr != root->right) root = root->...原创 2020-10-30 22:11:40 · 252 阅读 · 0 评论 -
leetcode刷题.129. 求根到叶子节点数字之和.每日打卡
这里采用的是先序遍历 ,代码:class Solution {public: int sumNumbers(TreeNode* root) { if(nullptr == root) return 0; int sum = 0; stack<int> cur_val; stack<TreeNode *> mystack; cur_val.push(roo..原创 2020-10-29 19:11:45 · 219 阅读 · 0 评论 -
leetcode刷题.143. 重排链表.每日打卡
代码:class Solution {public: /* 链表反转 */ ListNode* reverse(ListNode* head) { if (nullptr == head) return head; ListNode* p1 = nullptr, * p2 = head; ListNode* p3 = p2->next; while (nullptr != p3) { p2->next = p1; p1 = p2;..原创 2020-10-25 21:18:18 · 214 阅读 · 0 评论 -
leetcode刷题.845. 数组中的最长山脉.
代码:class Solution {public: int longestMountain(vector<int>& A) { int max_length = 0, index = 0; while(index + 1 < A.size()) { while(index + 1 < A.size() && A[index] >= A[index + 1]) ...原创 2020-10-25 01:25:39 · 171 阅读 · 0 评论 -
leetcode刷题.763. 划分字母区间.每日打卡
解法:贪心 + 双指针代码:class Solution {public: vector<int> partitionLabels(string S) { vector<int> out_; int last_[26] = { 0 }; for(int i = 0; i < S.length(); i++) last_[S[i] - 'a'] = i; int s..原创 2020-10-22 19:18:15 · 228 阅读 · 0 评论 -
leetcode刷题:85. 最大矩形 . 每日打卡
给定一个仅包含0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。示例:输入:[ ["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]输出: 6代码:// 动态规划的思想int MaximumRectangle(const vector<vector<char>> &matr...原创 2020-10-20 20:40:10 · 182 阅读 · 0 评论 -
Byte Dance面试题:等概率生成
已知随机数生成函数f(),返回0的概率是60%,返回1的概率是40%。根据f()求随机数函数g(),使返回0和1的概率是50%,不能用已有的随机生成库函数。简单思路就是:两次调用f(),则有四种情况:(1, 0)= 0.24、(0, 1)= 0.24、(0, 0)= 0.36、(1, 1)= 0.16,也就是说确定两次调用和即:f() + f() == 1的情况下只可能是(1, 0)或者(0, 1)这两种情况,且概率均等。伪代码:int g() { int a = 0, b .原创 2020-10-17 12:41:47 · 659 阅读 · 0 评论 -
面试算法题. 迭代方法求二叉树的高度
#include <iostream>#include <stack>using namespace std;struct TreeNode{ TreeNode(int v) : val(v), left(nullptr), right(nullptr){ } int val; TreeNode *left; TreeNode *right;}; int highBinaryTree(TreeNode*.原创 2020-05-27 20:59:53 · 292 阅读 · 0 评论 -
面试算法题. 二叉树前、中、后序遍历的迭代版本. 简单复习
// 1. 先序遍历 void FirstSearch(TreeNode* root) { if (nullptr == root) return; stack<TreeNode*> stack_; stack_.push(root); while (stack_.size()) { TreeNode* node = stack_.top()..原创 2020-05-25 15:40:06 · 166 阅读 · 0 评论 -
面试算法题. 单链表反转的递归版本
// 链表节点结构struct ListNode { ListNode(int a = 0) : val(a), next(nullptr) { } int val; ListNode* next;};// 递归版本的链表反转ListNode* ReverseList(ListNode* head) { if (nullptr == head) return nullptr; if (nullptr == head->next) return head;.原创 2020-05-23 02:07:47 · 151 阅读 · 0 评论 -
leetcode刷题. 面试题55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 bool IsBalanced(TreeNode *root, int &depth) { if (nullptr == root) return true; int left = 0, right = 0; if (IsBalanced(root-&.原创 2020-05-23 01:42:22 · 195 阅读 · 0 评论 -
leetcode刷题. 35. 搜索插入位置. 简单二分
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。 int binarySearch(vector<int> &nums, int target, int lo, int hi) { if(lo == hi) ...原创 2020-05-01 12:09:00 · 135 阅读 · 0 评论 -
leetcode刷题. 24. 两两交换链表中的节点. 递归解法
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 ListNode* swapPairs(ListNode* head) { if(nullptr == head) return nullptr; ListNode *p1 = nullptr...原创 2020-04-30 16:01:18 · 137 阅读 · 0 评论 -
leetcode刷题. 18. 四数之和. 双指针解法
给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。这里需要考虑去重。vector<vector<int>> fourSum(vector...原创 2020-04-30 14:56:43 · 122 阅读 · 0 评论 -
leetcode刷题. 16. 最接近的三数之和. dfs解法
给定一个包括n 个整数的数组nums和 一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。void my_dfs(vector<int>& nums, int target, int cur, int sum, int od, int& sumClosest)...原创 2020-04-30 14:05:57 · 297 阅读 · 0 评论 -
leetcode刷题. 9. 回文数. 202. 快乐数. 每日打卡
9. 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 bool isPalindrome(int x) { if(x < 0 || (x % 10 == 0 && x != 0)) return false; int reverse = 0; ...原创 2020-04-30 13:00:35 · 228 阅读 · 0 评论 -
leetcode刷题. 1095. 山脉数组中查找目标值. 每日打卡
(这是一个 交互式问题)所谓交互式问题就是需要使用自定义类型本身提供的接口!给你一个 山脉数组mountainArr,请你返回能够使得mountainArr.get(index)等于target最小的下标 index值。如果不存在这样的下标 index,就请返回-1。 // 升序 int binarySearch1(MountainAr...原创 2020-04-29 14:31:25 · 177 阅读 · 0 评论 -
leetcode刷题. 852. 山脉数组的峰顶索引. 每日打卡
我们把符合下列属性的数组A称作山脉:A.length >= 3存在 0 < i< A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]给定一个确定为山脉的数组,返回任何满足A[0] < A[1] < ... A...原创 2020-04-29 13:52:09 · 184 阅读 · 0 评论 -
leetcode刷题. 面试题56 - I. 数组中数字出现的次数. 每日打卡
一个整型数组nums里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 vector<int> singleNumbers(vector<int>& nums) { int ret = 0; for(auto elem : nums)...原创 2020-04-28 14:39:14 · 228 阅读 · 0 评论 -
面试算法题. 动态规划和贪心算法的区别
首先动态规划和贪心都是用来解决问题的,我们用Q(N)来表示所要解决的总规模为N的问题的集合,我们的最终结果就是要选出一个子集A(N)Q(N)使得在这个子集上构建的某种映射F(A(N))是最优的。对于动态规划来说,要解决Q(n),首先要解决A(1)、A(2)、......A(N - 1),A(N)此时是在{A(1), A(2), ......,A(N - 1)}的某个子集的基础上得到的。...原创 2020-04-28 02:34:48 · 343 阅读 · 0 评论 -
leetcode刷题. 714. 买卖股票的最佳时机含手续费
给定一个整数数组prices,其中第i个元素代表了第i天的股票价格 ;非负整数fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。状态方程:cash[...原创 2020-04-27 23:52:39 · 225 阅读 · 0 评论 -
leetcode刷题. 829. 连续整数求和 . 数学解法
给定一个正整数N,试求有多少组连续正整数满足所有数字之和为N?int consecutiveNumbersSum(int N) { int count = 0; int klimits = sqrt(2 * N) + 1; int tmp = 0; for (int k = 1; k <= klimits; k++) { if (2 * N % k ==...原创 2020-04-27 22:05:05 · 321 阅读 · 0 评论 -
面试算法题. 求N的平方根, 精确度为e
二分:N - e < x * x < N + edouble qart(double N, double e) { double lo = 0; double hi = N; double result = 0; double mid = 0, square = 0; while (1) { mid = (lo + hi) / 2; square = m...原创 2020-04-27 21:13:17 · 474 阅读 · 0 评论 -
leetcode刷题. 33. 搜索旋转排序数组. 每日打卡
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是O(logn) 级别。int findTarget(vector<in...原创 2020-04-27 14:56:37 · 164 阅读 · 0 评论 -
面试算法题. 139. 单词拆分
给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判定s是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分可以重复使用字典中的单词 你可以假设字典中没有重复的单词// 单词拆分bool recursion(const string& s, int idx, unordered_set<string>& set) { ...原创 2020-04-26 23:26:51 · 157 阅读 · 0 评论 -
leetcode刷题. 39. 组合总和. dfs解法
给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。 解集不能包含重复的组合。 void my_dfs(vector<int> &candidat...原创 2020-04-26 18:43:42 · 129 阅读 · 0 评论 -
leetcode刷题. 54. 螺旋矩阵
给定一个包含mxn个元素的矩阵(m行,n列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 void recursion(vector<vector<int>> &matrix, int p1x, int p1y, int p2x, int p2y, vector<int> &output, int idx) ...原创 2020-04-26 14:59:14 · 145 阅读 · 0 评论 -
leetcode刷题. 93. 复原IP地址. 每日打卡
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。暴力破解吧,没太多技巧。bool ipTest(string s) { if (s.empty()) return false; if (s.length() > 3) return false; if (s.length...原创 2020-04-26 14:11:13 · 149 阅读 · 0 评论 -
leetcode刷题. 面试题51. 数组中的逆序对. 每日打卡
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。归并排序,时间复杂度o(nlog(n)), 空间复杂度o(n)class Solution3 {public: int reversePairs(vector<int>& nums) { vector<int> t...原创 2020-04-25 14:01:10 · 209 阅读 · 0 评论