我想在下面的例子中理解"中位数中位数"算法:
我们有45个不同的数字,分为9组,每组5个元素.
48 43 38 33 28 23 18 13 8
49 44 39 34 29 24 19 14 9
50 45 40 35 30 25 20 15 10
51 46 41 36 31 26 21 16 53
52 47 42 37 32 27 22 17 54
Run Code Online (Sandbox Code Playgroud)
第二步递归,找到中位数的"真实"中位数(50 45 40 35 30 25 20 15 10)即该集合将分为两组:
50 25
45 20
40 15
35 10
30
Run Code Online (Sandbox Code Playgroud)
对这两组进行排序
30 10
35 15
40 20
45 25
50
Run Code Online (Sandbox Code Playgroud)中位数是40和15(如果数字是偶数我们左中位数)所以返回值是15但是中位数的"真实"中位数(50 …
据我所知,为了检测链表中的循环,我可以使用Hare和Tortoise方法,它有2个指针(慢速和快速).但是,在阅读了wiki和其他资源之后,我不明白为什么保证这两个指针在O(n)时间复杂度上会满足.
问题:达到结束的最小跳跃次数
给定一个整数数组,其中每个元素表示可以从该元素向前进行的最大步数.编写一个函数来返回到达数组末尾的最小跳转次数(从第一个元素开始).如果元素为0,那么我们就无法遍历该元素.
例:
输入:arr [] = {1,3,5,8,9,2,6,7,6,8,9}输出:3(1-> 3 - > 8 - > 9)第一个元素是1,所以只能转到3.第二个元素是3,所以最多可以制作3个步骤,即5个或8个或9个.
资料来源:http://www.geeksforgeeks.org/minimum-number-of-jumps-to-reach-end-of-a-given-array/
我已经制作了一个线性时间算法来查找到达数组末尾所需的最小跳跃次数.
源代码如下:
int minJumpsUpdated(int arr[], int n)
{
int *jumps = malloc(n * sizeof(int)); // jumps[n-1] will hold the result
int i =1, j = 0;
jumps[0] = 0;
for (i = 1; i < n; ) {
// if i is out of range of arr[j], then increment j
if (arr[j] + j < i && j < i) {
j++; …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a = b.a;
cout << "Copy Constructor\n";
}
A fun(A a)
{
return a;
}
};
int main()
{
A a, c;
A b = a.fun(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出g++ file.cpp是:
Constructor
Constructor
Copy Constructor
Copy Constructor
Run Code Online (Sandbox Code Playgroud)
上面代码的输出g++ -fno-elide-constructors file.cpp是:
Constructor
Constructor
Copy Constructor
Copy Constructor
Copy Constructor
Run Code Online (Sandbox Code Playgroud)
我知道返回值优化.我的问题是哪个复制构造函数的调用被删除(返回期间的临时对象或被复制到b的返回对象)?
如果省略的复制构造函数是用于创建b的构造函数,那么如何创建b(因为在这种情况下也没有构造函数调用)?
如果我替换行A b …
c++ copy-constructor temporary-objects return-value-optimization copy-elision
给定n个整数和一个整数k,告诉给定n个整数有多少这样的对,使得该对中两个元素的总和可以被k整除?
我不知道n和k的界限.因此,为简单起见,假设n和k不是很大.
不言而喻,尽可能提供最佳解决方案.(我知道天真的方法:-)!)
假设我有一个包含2n + 2个元素的数组.数组中的n个元素出现两次,剩下的两个元素是唯一的.你必须在O(n)时间和O(1)空间中解决这个问题.其中一个解决方案是使用XOR.但我无法理解这一点.有人可以帮我解决这个问题,还是可以给我更好的解决方案
问题和解决方案的链接就是这样
我已经彻底阅读了关于 sbrk() 的 linux 手册:
sbrk() 改变程序中断的位置,它定义了进程数据段的结束(即程序中断是未初始化数据段结束后的第一个位置)。
问题是: 当我调用 sbrk(1) 时,为什么它说我正在增加堆的大小?正如手册所说,我正在更改“数据段和 bss”的结束位置。那么,数据段和bss的大小应该增加多少,对吗?
你们中有人知道使用生成树数据结构的任何实际应用程序吗?
以下运行程序在g++ 4.8.232位Linux系统上给出了输出12:
vector<char> v;
cout << sizeof(v) << endl;
Run Code Online (Sandbox Code Playgroud)
我看到了这一点,并知道这sizeof(v)可能是特定于实现的.不过,我想知道什么可能导致该载体的大小为12.我认为是,迭代器v.begin()和v.end()可能是导致8个字节的大小.我对么?如果是的话,剩下的4个字节的大小是什么?如果没有,这12个字节到底是什么?