![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
charles666_zq
这个作者很懒,什么都没留下…
展开
-
从数组中任选数量的元素,元素和为目标值,有多少种组合
题目数组中元素为正整数,如data = {1, 2, 3, 6},目标值target=6,求data中有多少种组合的和为target值。思路暴力遍历data的每一种组合,使用掩码+prev_permutation的组合。int fun(const vector<int>& data, int target){ int N = data.size(); vector<bool> bitMask(N, false); int count = 0; for (in原创 2020-10-11 19:35:23 · 1235 阅读 · 1 评论 -
归并排序
#include <iostream>using namespace std;void merge(int a[], int lo, int mid, int hi){ int* b = new int[mid - lo]; for (int i = 0; i < mid - lo; ++i) b[i] = a[lo + i]; for (int i = lo,j = 0, k = mid; i < hi; ++i) { if (k > hi - 1 || (原创 2020-10-09 10:24:57 · 68 阅读 · 0 评论 -
leetcode148排序链表
参考:zxy-23的优雅的C++递归,归并排序class Solution {public: ListNode * sortList(ListNode * head) { return (head == NULL)? NULL: mergeSort(head); }private: ListNode * findMid(ListNode * head) { ListNode * slow = head; Lis转载 2020-10-09 09:06:07 · 59 阅读 · 0 评论 -
深信服2020-9-24笔试
编程题有两题,第一题是大学录取问题,第二题是字符串最大匹配问题。第一题通过80%,运行超时。可能是sort超时,也可能是大学已经录取完毕,但还有很多考生没处理。#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ int T; cin >> T; vector<int> N(T), M(T); vecto原创 2020-09-24 21:09:56 · 1046 阅读 · 0 评论 -
菱形继承与虚基表
参考:C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1)菱形继承问题派生类D中包含两份B基类的数据,不仅有数据冗余,还只能通过C1::m_b这样的方式来使用成员变量。虚继承class B{};class C1:virtual public B {};虚继承会在C1类中加入一个vbptr(虚基指针)和一个vbtable(虚基表)测试代码:#include <iostream>using namespace std;class Grand{pub转载 2020-09-18 14:12:48 · 137 阅读 · 0 评论 -
背包问题
背包问题参考:背包问题九讲01背包问题LeetCode:416. 分割等和子集该题可以转换成01背包问题,数组和的一半作为背包,需要装满背包,即初始化时dp[0][0]=0,dp[0][1...v]=INT_MIN;,第一版代码如下,时间复杂度O(lenv),空间复杂度O(lenv)。class Solution {public: bool canPartition(vector<int>& nums) { int len=nums.size();转载 2020-09-17 21:22:55 · 60 阅读 · 0 评论 -
快排
#include <iostream>#include <vector>#include <algorithm>using namespace std;void shuffle(vector<int> &nums){ int n = nums.size(); for (int i = 0; i < n; i++) { swap(nums[i], nums[rand() % (n - i) + i]); } return原创 2020-09-13 00:39:19 · 99 阅读 · 0 评论 -
组合、排列、幂集
组合从N个不同元素中选K个,输出所有情况。CNK=N!K!(N−K)!C_{N}^{K}=\frac{N!}{K!(N-K)!}CNK=K!(N−K)!N!方法1:掩码排列void combination(int N, int K){ string bitMask(K, 1); bitMask.resize(N, 0); do { for (int i = 0; i < N; i++) { if (bitMask[i] == 1) cout <<原创 2020-09-10 23:29:35 · 241 阅读 · 0 评论 -
建堆
建堆操作仅需要O(n)的时间复杂度,可用来找最大值或者TOP(k)问题。需要注意移位操作(<<)的优先级比加/减(+/-)的低,需要加括号。#include <iostream>#include <vector>using namespace std;void down(vector<int> &a, int i){ int n = a.size(); while (((i << 1) + 1) < n || ((i原创 2020-09-09 23:42:47 · 105 阅读 · 0 评论 -
数据结构与算法题
数据结构与算法题贪心算法和动态规划啥区别?B树、B+的区别BitMap位图参考:https://blog.csdn.net/archyli/article/details/78573362位图BitMap:位图是一个数组的每一个数据的每一个二进制位表示一个数据,0表示数据不存在,1表示数据存在。核心操作:void Set(size_t x){ int index = x / 32;//确定哪个数据(区间) int temp = x % 32;//确定哪个Bit位 _b原创 2020-09-07 01:46:21 · 82 阅读 · 0 评论