算法题
文章平均质量分 52
~AC~
这个作者很懒,什么都没留下…
展开
-
01背包-go实现
func pack(weight, value []int, cap int) int { dp := make([][]int, 0)//dp[i][j]表示容量j下前i个物品最大的value for i := 0; i <= len(value); i++ { dp = append(dp, make([]int, cap + 1)) } for i := 1; i <= cap; i++ { for j := 1; j <= len(weight); j++ {原创 2021-09-29 18:17:39 · 147 阅读 · 0 评论 -
不用乘数号计算1+2+....+n --- C++实现
int getSumFromOneToN(int n){ if(n < 0) return -1; if(n == 0) return 0; char arr[n+1][n]; return sizeof(arr)>>1; //右移一位相当于除以2}原创 2019-05-18 18:02:20 · 207 阅读 · 0 评论 -
三角形最短路径问题---C++实现
从倒数第二排开始,利用nums[i][j] = nums[i][j] + min(nums[i + 1][j], nums[i + 1][j + 1]);int getShortestPath(vector<vector<int> >nums) { if (!nums.size()) return 0; for (int i = nums.size() - ...原创 2019-05-21 19:59:32 · 1372 阅读 · 0 评论 -
反转字符串---C++实现
//如果字符串中单词之间有多个空格 反转后的字符串仍保留多个空格//输入" i love you" => "you love i " (注意字符串开头或结尾仍可能有空格)string reverseString(string str) { if (!str.size()) return ""; string res = ""; //返回结果 string su...原创 2019-05-21 10:32:00 · 728 阅读 · 0 评论 -
求集合子集---C++实现
思路:int arr[] = { 0,1,2,3,4 };递归遍历整个数组,遍历到第0个位置,我们就求出含有0的所有子集,遍历到第1个位置,我们就求出含有1不含0的所有子集,依次类推,遍历到第3个位置,我们求出含有3而不含0 1 2 的所有子集。 //loc表示当前位置 loc == len为递归终止条件 void getAllSubSet(int* arr, int len, in...原创 2019-05-20 21:25:19 · 3380 阅读 · 0 评论 -
丑数(剑指offer)---C++实现
《参考程序员面试金典》伪代码如下1)初始化array和队列:Q2 Q3 Q52)将1插入array3)分别将12、13 、1*5插入Q2 Q3 Q54)令x为Q2 Q3 Q5中的最小值,将x添加至array尾部5)若x存在于:Q2:将 x * 2、x * 3、x5 分别放入Q2 Q3 Q5,从Q2中移除xQ3:将 x * 3、x5 分别放入Q3 Q5,从Q3中移除xQ5:将 x ...原创 2019-05-13 21:06:53 · 214 阅读 · 0 评论 -
判断平衡二叉树(剑指offer)---C++实现
解法一:前序(中序、后序)遍历二叉树,计算每个结点左右子树高度,查看每个结点是否满足平衡二叉树性质。 复杂度太高!O(nlgn)解法二:在求解树高度的过程中,加入一个标志位flag,只需要遍历一次即可。复杂度O(n)int getDepth(TreeNode* root, bool& flag){ if(root){ int leftDepth = getD...原创 2019-05-13 19:48:50 · 614 阅读 · 0 评论 -
大数相加---C++实现
#include <iostream>#include <string>using namespace std;/*大数相加*///在字符串前面加0 使2字符串长度相等 这样进行相加时的逻辑判断会较为简单void formatStringWithZero(string& s, int n) { for (int i = 0; i < n; ...原创 2019-04-19 11:38:12 · 1877 阅读 · 1 评论 -
旋转数组的二分查找---C++实现
例如int arr[] = {4,5,6,7,0,1,2,3} ;int arr[] = {5,6,0,1,2,3,4]称为旋转数组 在该数组中实现二分查找思路:每次找mid位置 必有一边是严格单增的 再通过目标值与arr[end]的大小来改变每次搜索的begin和end的值/*旋转数组的二分搜索int arr[] = {4,5,6,7,0,1,2,3}实现二分搜索*/int r...原创 2019-04-23 18:57:13 · 328 阅读 · 0 评论 -
递增可重复数组中求一个数下标最大值(时间复杂度O(lgn))---C++实现
int arr[] = {1,2,3,3,4,4,4,5} 求4的下标 返回6int arr[] = {1,2,3,3,4,4,4,5} 求3的下标 返回3int arr[] = {1,2,3,3,4,4,4,5} 求7的下标 返回-1int getMaxLoc(int* arr, int len, int target) { if (arr && len) { i...原创 2019-04-23 18:30:22 · 243 阅读 · 0 评论 -
N皇后问题---C++实现
利用dfs和回溯思想,关键是要利用好3个条件:1.所在列没有皇后2.所在位置主对角线上没有元素3.所在位置斜对角线上没有元素 利用状态数组保存这3个条件的信息int num = 0;void dfs(vector<vector<int> >& res,vector<vector<int> >&flag ,int leve...原创 2019-05-02 19:15:14 · 222 阅读 · 0 评论 -
至少有K个重复字符的最长子串(LeetCode395)---C++实现
思路:最差的方法是双重循环,时间复杂度O(n^2),所有一定可以优化为O(nlgn)。联想到快排、归并排序,都是分治的思路,这里也是利用分治,关键是找到分治的区分点。遍历字符串,找到出现次数少于k次的字符,位置记为i,分为(0,i-1) 和(i+1, s.size() - 1)两个区间,再递归,最后取两区间的最大值。int longestSubstring(string s, int ...原创 2019-05-28 07:57:27 · 928 阅读 · 0 评论 -
实现一个容器,在O(1)的时间复杂度下实现插入、删除、取随机数(LeetCode380)---C++实现
思路:利用hashMap和vector,hashMap中保存key和key对应在vector中的索引,删除时vector只需要调用resize函数即可删除尾端元素(前提是将需要删除的元素和尾部元素交换)。 class RandomizedSet {public: /** Initialize your data structure here. */ RandomizedSet() ...原创 2019-05-28 10:02:50 · 826 阅读 · 0 评论 -
单链表快排(momenta一面题) ---C++面试
下午面了momenta,单链表快排没答出来,是自己能力不够,正好可以查漏。思路:利用节点值域的交换,主要思想还是partiiton,将链表分隔成左右两部分,按照头结点的data(即为tag),左边的data都小于tag,右边的data都大于tagnode* partition(node* &head, node* end) { //链表为空或者head == end 为递归出口...原创 2019-05-23 20:40:07 · 956 阅读 · 0 评论 -
编辑距离(LeetCode72)---C++实现
先附上LeetCode上此题的OJ网址,有需要可点击直达一般求最短距离、存在性问题、可能性的总数都要想到动态规划。思路:动规核心思想就是空间换时间,用数组存储下之前的信息,计算之后的情况便不需要再重新计算以前的情况了。 这里我们用dp[i][j]表示word1从[0…i - 1]的位置 编辑到word2[0…j - 1]的位置的最短距离(例如对于word1 = “horse”,word2...原创 2019-07-08 09:35:24 · 1019 阅读 · 0 评论 -
约瑟夫环问题,看这个,就够了
戳我转载 2019-06-23 21:56:46 · 295 阅读 · 0 评论 -
正则匹配(LeetCode10&剑指offer)---C++动态规划解决
vector<vector<bool>>flag(len1 + 1, vector<bool>(len2 + 1, false)); flag[0][0] = true;边界情况这里flag[i][j]表示pattern[0~j-1]是否可以匹配str[0~i-1],(注意flag[i][j] 对于pattern[j - 1] str[i - 1])首先...原创 2019-06-17 20:04:04 · 406 阅读 · 0 评论 -
合并两个有序链表(三种方法)---C++实现
方法一:若要求不能对原始链表更改,则必须使用额外空间//使用额外空间来合并链表 不对原始链表做改变node* mergeTwoLinkListWithExtraPlace(node *head1, node *head2) { /*先创建一个头结点 这里用任意的整数都可以 不一定用0 之后返回newHead->next 即可 该方法在很多时候都可以起到简化代码的作用 值得借鉴*/...原创 2019-06-10 08:42:43 · 30489 阅读 · 0 评论 -
双指针的巧妙运用=>接雨水(LeetCode42)---C++实现
注意:此题不是求最大阴影面积思路:1.所接的雨水的多少应该和较小一端有关系(木桶原理),首先两个指针分别指向头尾,小的一方先走2.同时记录左右两边最大值,如果此时的值比最大值还大,则更新最大值,否则可以接雨水。int trap(vector<int>& height) { if (height.size() < 2) { return...原创 2019-06-09 21:09:32 · 798 阅读 · 0 评论 -
加油站(LeetCode134)---C++实现
思路:1.首先介绍一个定理,如果一个整数序列累加和非负,那么一定可以找到一个起点,以该起点开始的序列累加和都非负。2.由1知,只要gas累加和>=cost累加和 解一定存在,反之,一定无解3.进行一次遍历,totalGas记录每个加油站gas[i]-cost[i]的和,curGas记录当前油箱油量,startLoc记录符合要求的起点加油站,所以知道当curGas[i]< 0...原创 2019-06-02 21:28:59 · 526 阅读 · 0 评论 -
子序列组合拳 => 最长连续子序列(leetcode128)&最长递增子序列长度(leetcode300)&最长递增子序列个数(leetcode673)---C++实现
最长连续子序列思路1.空间换时间,利用哈希表存储原始数据。2.遍历原始数组,例如遍历到nums[i],在哈希表中先往num[i]右边找,即num[i] + 1方向;再往左边找,即nums[i] - 1方向。3.优化,每次往左右找时,即可把左右的数在哈希表中删除,防止重复查找 O(n)+O(n)int longestConsecutive(vector<int>&...原创 2019-06-02 10:22:39 · 314 阅读 · 0 评论 -
有序数组中不同平方值的个数(头条面试题)---C++实现
题目:求解一个有序数组不同平方值的个数,{-1,-1,0,1,1}这里平方值只有0,1两种情况,返回2;{-3,-1,0,0,2,3}这里拼房族有0,1,4,9共4中情况,返回4。要求:时间复杂度O(n)空间复杂度O(1)思路:刚开始看到这题,哈希表应该是大多数人都能想到的,且复杂度要求都能满足。就是遍历数组,把每个数的平方放入哈希表中去重即可。但是这种想法很难通过面试,因为有序的...原创 2019-05-29 16:25:21 · 1393 阅读 · 0 评论 -
判断数组中是否存在递增的三元子序列(LeetCode334)---C++实现
思路:记录两个值,一个small,一个big。遍历数组,如果小于small,则更新small,不然如果小于big,则更新big,如果大于big,则存在递增三元子序列bool increasingTriplet(vector<int>& nums) { int small = INT32_MAX; int big = INT32_MAX; int i = 0; w...原创 2019-05-29 10:05:24 · 707 阅读 · 0 评论 -
栈的合法输出顺序---C++实现
利用辅助栈,先初始化辅助栈,将输出序列压入栈中,输入序列依次入栈,如果入栈的顶部元素和出栈一致,则入栈和出栈都弹出元素。bool isLegal(const string& str1, const string& str2) { if (!str1.size() || !str2.size()) return false; stack<char>in, o...原创 2019-05-28 19:48:08 · 2135 阅读 · 0 评论 -
1-n中缺失的一个数---C++实现
题目描述:数组中有n-1个数,是1-n中n个数缺失一个数后的一种随机排序,例如 int arr[5] = {3,1,4,6,2} 可以得到 数组中缺失的数为5。思路:先求数组中所有数的异或值num1,再求1-n中所有数的异或值num2,num1再异或上num2即为答案。int lostNum(int* arr, int len) { if (arr && len) { ...原创 2019-05-02 14:47:38 · 814 阅读 · 0 评论 -
二叉搜索树第K小(大)的结点---C++实现
二叉搜索树中序遍历递增,要得到第K小的数明显进行中序遍历即可,而第K大的数类似,可以通过中序遍历的逆序来得到。// 调用node* res = getKthMinNodeOfBST(root,k);node* getKthMinNodeOfBST(node* root,int k) { static int curNum = 1; //这里使用静态变量记录当前的位置,注意静态变量只...原创 2019-05-02 14:26:23 · 551 阅读 · 0 评论 -
数据流中获取随时获取中位数(堆结构的应用)
问题:有一个每刻都在往外吐数据的机器,要求在时间复杂度O(N)内求出。思路:运用堆的性质,准备一个大根堆,一个小根堆,每次吐的数据都进入小根堆中,当发现小根堆的size比大根堆多2个时,此时小根堆头节点出堆进入大根堆中,这样两个堆的size差距最多为1,中位数必然是两个堆的头节点取得。当然,如果总的数据个数为偶数,需要对两个堆头节点取平均值。对于stl中比较器不了解的可以查阅https:...原创 2019-01-01 20:39:43 · 789 阅读 · 0 评论 -
数组中找出单独出现的2个数
一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。#include <iostream>using namespace std;void find_Two_Single_Num(int *arr, int &num1, int &num2,int len) { int t = 0; for (int i = 0; i...原创 2019-01-10 20:15:06 · 334 阅读 · 0 评论 -
不使用四则运算求和
要求实现一个求和函数 不能使用+,-,*,/使用逻辑运算符和移位运算符int add (int a,int b){ int num1 = a^b;//先不进位求a+b int num2 = (a&amp;b)&lt;&lt;1; //再求该进位没有进位的地方,也就是此时a+b=num1+num2,所以num2为0时num1就是所求的值 while(num2){ num1 = num...原创 2019-01-10 19:31:58 · 219 阅读 · 0 评论 -
说反话 栈实现
利用栈 能很快解决该问题#include <iostream>#include <stack>using namespace std;#include <string>int main(){ stack<string>str_stack; string s; cin >> s; str_stack.push(s); ...原创 2018-12-24 13:09:06 · 212 阅读 · 0 评论 -
kmp衍生题 添加字符使字符串包含2个原始子串
题目:已知一个字符串 向末尾添加字符,使新的字符串包含2个原始子串 ,例如原始串为aba 只需添加一个b即可, 若原始子串为abc 则需添加abc,若原始子串为aaa,则只需要加一个a即可。 #include <iostream> #include <string> #include <vector> using namespace...原创 2018-12-24 12:54:30 · 155 阅读 · 0 评论 -
KMP字符串算法
#include <iostream>#include <string>#include <vector>using namespace std;//求next数组vector<int> Next_arr(const string& s) { vector<int>v(s.size()); v[0] = -1; /...原创 2018-12-24 12:51:40 · 94 阅读 · 0 评论 -
行列都有序的二维数组查找问题
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。#include <iostream>#include <vector>using namespace std;bool Find(int target, vector<...原创 2018-12-27 21:19:07 · 377 阅读 · 0 评论 -
小米oj 帮小学生排队
#include <iostream>using namespace std;#include <set>#include <vector>class mpair {public: mpair() {}; mpair(int a, int b) :a(a), b(b) {}; int a; int b; friend istream&...原创 2018-12-26 19:02:43 · 458 阅读 · 0 评论 -
PAT1012乙级
#include&lt;iostream&gt;#include&lt;stdio.h&gt;#include&lt;iomanip&gt; using namespace std;void find0(int *a,int n)//找被5整除的偶数 { long long sum = 0; for(int i=0;i&lt;n;i++) { if(a[i]%原创 2018-11-03 22:54:54 · 178 阅读 · 0 评论 -
最大子列和问题 -来自姥姥的解法
sum为要求的最大值,该方法只需遍历一次数组,故复杂度为O(n)若该序列为1 2 3 -4 -3 8thissum=1, thissum=3, thissum=6, thissu...原创 2018-10-26 20:41:45 · 93 阅读 · 0 评论 -
面试题:不使用乘号实现乘法
利用位运算,乘数每次右移一位,被乘数每次左移一位.#include <iostream>#include <math.h>/*不适用乘号实现乘法*/int multiply(int a, int b) { int res = 0; a = fabs(a); //求绝对值 b = fabs(b); while (a) { int t = a &a...原创 2019-03-05 13:07:01 · 2014 阅读 · 1 评论 -
C/C++实现并查集
#include "pch.h"#include <iostream>using namespace std;/**并查集*/int getRoot(int* parent, int len, int loc) { if (parent && len && loc > -1) { while (parent[loc] != ...原创 2019-03-29 15:37:04 · 783 阅读 · 0 评论 -
找出数组中单独出现的两个数
一个数组,其他数均出现偶数次,只有两个数只出现一次。C++实现#include <iostream>#include <vector>using namespace std;void findTwoNum(const vector<int>&v) { if (v.size()) { int temp; for (int i = ...原创 2019-03-30 20:00:46 · 212 阅读 · 0 评论 -
数组中两个数的最大异或值(LeetCode 421)---C++实现
利用字典树,将一个数31位信息存入字典树。然后遍历数组,将每个数取反,在字典树中寻找与取反后的数最匹配的即为数组任一个数与该数异或的最大值。#include <iostream>using namespace std;/*数组中两数异或最大值*/typedef struct Trie { struct Trie* datas[2]; Trie() { dat...原创 2019-04-18 10:42:24 · 938 阅读 · 0 评论