-
Notifications
You must be signed in to change notification settings - Fork 7.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from julycoding/master
Merge
- Loading branch information
Showing
436 changed files
with
5,600 additions
and
1,760 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
{ | ||
"title": "The Art of Programming By July", | ||
"description": "本书是July和他伙伴们的《程序员编程艺术》的电子书", | ||
"coverimage": "TAOP.png" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
/** | ||
* Copyright (c) 2014 The TAOPP book Authors. All rights reserved. | ||
* Use of this source code is governed by a BSD-style license that can be found | ||
* in the LICENSE file. | ||
* | ||
* Filename: LCAProblem.c | ||
* Brief: The C program for solving LCA problem | ||
* Version: 0.1 | ||
* Created: Tue Mar 18 21:25:58 2014 | ||
* | ||
* Author(s): Liang Wang<fairywell28@yahoo.com> | ||
* eriol | ||
* July | ||
* | ||
*/ | ||
|
||
/** | ||
* @brief 在二叉排序树中查找给定两个节点的LCA节点 | ||
* | ||
* @author C version 0.1, 2014/3/18, Liang Wang<fairywell28@yahoo.com> | ||
* C++ version 0.2, 2014, July | ||
* C++ version 0.1, 2011, eriol | ||
* @brief 在二叉排序树中查找给定两个节点的LCA节点 | ||
* | ||
* @param root 该二叉排序树的根节点指针 | ||
* @param u 给定节点一的指针 | ||
* @param v 给定节点二的指针 | ||
* | ||
* @return 找到LCA节点返回其指针;否则返回NULL | ||
*/ | ||
Node* FindLowestCommonAncestorBst(Node* root, Node* u, Node* v) | ||
{ | ||
int left_value = u->value; | ||
int right_value = v->value; | ||
Node* parent_node = NULL; | ||
Node* cur_node = root; | ||
|
||
// 参数检查 | ||
if (NULL == root || NULL == u || NULL == v | ||
|| root == u || root == v || u == v) { | ||
fprintf(stderr, "Wrong input data! Exit!"); | ||
return NULL; | ||
} | ||
|
||
// 调整左右节点值到正确 | ||
if (left_value > right_value) { | ||
swap(left_value, right_value); | ||
} | ||
|
||
while (cur_node) { | ||
// 如果cur_node的值小于u、v的值,说明LCA节点应该在其右子树中 | ||
if (cur_node->value < left_value) { | ||
parent_node = cur_node; | ||
cur_node = cur_node->right; | ||
} else if (cur_node->value > right_value) { | ||
// 如果cur_node的值大于u、v的值,则应该查询其左子树 | ||
parent_node = cur_node; | ||
cur_node = cur_node->left; | ||
} else if (cur_node->value == left_value || cur_node->value == right_value) { | ||
// 找到节点u或者v处,说明其父节点即为所求 | ||
return parent_node; | ||
} else { | ||
// 现在cur_node的值处于u和v的值之间,显然即为所求 | ||
return cur_node; | ||
} | ||
} | ||
|
||
// 数据有误,找不到任何的LCA节点 | ||
return NULL; | ||
} | ||
|
||
/** | ||
* @brief 在二叉排序树中查找给定两个节点的LCA节点,递归版本 | ||
* | ||
* @author C version 0.1, 2014/3/19, Liang Wang<fairywell28@yahoo.com> | ||
* | ||
* @param root 该二叉排序树的根节点指针 | ||
* @param u 给定节点一的指针 | ||
* @param v 给定节点二的指针 | ||
* | ||
* @return 找到LCA节点返回其指针;否则返回NULL | ||
*/ | ||
Node* FindLcaBstRecursively(Node* root, Node* u, Node* v) | ||
{ | ||
// 参数检查 | ||
// NOTICE:特别包含了u、v即是root节点的情况,此时应该返回NULL | ||
if (NULL == root || NULL == u || NULL == v | ||
|| root == u || root == v || u == v) { | ||
fprintf(stderr, "Wrong input data: Arguments check failed! Exit!"); | ||
return NULL; | ||
} | ||
|
||
int left_value = u->value; | ||
int right_value = v->value; | ||
|
||
// 调整左右节点值到正确 | ||
if (left_value > right_value) { | ||
swap(left_value, right_value); | ||
} | ||
|
||
// 判断当前节点是否为所求LCA节点 | ||
// 情形1:u、v分别在root的左右子树上 | ||
if (root->value > left_value | ||
&& root->value < right_value) { | ||
return root; | ||
} | ||
|
||
// 情形2:u、v都在root的同一棵子树且u、v有一个节点是root的子节点 | ||
if (root->right == u || root->right == v | ||
|| root->left == u || root->left == v) { | ||
return root; | ||
} | ||
|
||
// 当前节点不是所求LCA,则递归返回左右子树的LCA节点 | ||
if (root->value < left_value) { // 查找右子树 | ||
return FindLcaBstRecursively(root->right, u, v); | ||
} else if (root->value > right_value) { // 查找左子树 | ||
return FindLcaBstRecursively(root->left, u, v); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
//compiled with g++ | ||
#include <iostream> | ||
#include <vector> | ||
#include <algorithm> | ||
#include <iterator> | ||
#include <cassert> | ||
using namespace std; | ||
|
||
void cycle_leader(vector<int> &a,int from, int mod) { | ||
for (int i = from * 2 % mod;i != from; i = i * 2 % mod) | ||
swap(a[from],a[i]); | ||
} | ||
|
||
void perfect_shuffle(vector<int> &a,int n){ | ||
int n2,m,i,k,t; | ||
vector<int>::iterator iter = a.begin()+1; //exclude index 0 | ||
for(;n > 1;){ | ||
//step 1 | ||
n2 = n * 2; | ||
for(k = 0,m = 1; n2 / m >=3; ++k,m *= 3) | ||
; | ||
m /= 2; | ||
// 2m = 3^k - 1 , 3^k <= 2n < 3^(k + 1) | ||
|
||
//step 2 STL/algorithm-rotate | ||
rotate(iter+m, iter+n, iter+m+n ); //right cyclic shift of the index[m+1,...,n+m] O(n) | ||
|
||
//step 3 | ||
for(i = 0,t = 1;i < k; ++i,t *= 3) | ||
cycle_leader(a,t,m * 2 +1); | ||
|
||
//step 4 | ||
iter += (m * 2); | ||
n -= m; | ||
} | ||
//n = 1 | ||
swap(a[1],a[2]); | ||
} | ||
|
||
int main(){ | ||
vector<int > a; | ||
a.push_back(0);//to make index start from 1 | ||
int num = 0,length = 0; | ||
cout<<"Please input your number to be shuffled and '0' to end up \n"; | ||
cin>>num; | ||
while(num != 0){ | ||
a.push_back(num); | ||
cin>>num; | ||
} | ||
cout<<"The input number is \n"; | ||
copy(a.begin()+1,a.end(),ostream_iterator<int> (cout," ")); | ||
cout<<"\n"; | ||
|
||
length = a.size(); | ||
assert(length % 2 == 1); //the size of input number is even | ||
perfect_shuffle(a,length / 2); | ||
|
||
cout<<"After shuffered,the number is \n"; | ||
copy(a.begin()+1,a.end(),ostream_iterator<int> (cout," ")); | ||
cout<<"\n"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
/* | ||
* By Frederick-S | ||
* 2014-03-08 | ||
*/ | ||
|
||
// 1. 穷举 | ||
|
||
/* | ||
* @param {Array} arr 目标数组 | ||
* @param {Number} number 在数组中查找两个数,使得其和为 number | ||
* @example | ||
* var arr = solution1([1, 2], 3); | ||
*/ | ||
function solution1(arr, number) { | ||
for (var i = 0, length = arr.length; i < length; i++) { | ||
for (var j = i + 1; j < length; j++) { | ||
if (arr[i] + arr[j] == number) { | ||
return [arr[i], arr[j]]; | ||
} | ||
} | ||
} | ||
|
||
return []; | ||
} | ||
|
||
// 2. 二分查找 | ||
|
||
/* | ||
* @param {Array} arr 目标数组 | ||
* @param {Number} number 在数组中查找两个数,使得其和为 number | ||
* @example | ||
* var arr = solution2([1, 2], 3); | ||
*/ | ||
function solution2(arr, number) { | ||
arr.sort(function (a, b) { | ||
return a - b; | ||
}); | ||
|
||
var index = 0; | ||
for (var i = 0, length = arr.length; i < length; i++) { | ||
index = binarySearch(arr, number - arr[i], 0, length - 1); | ||
|
||
if (index >= 0 && index != i) { | ||
return [arr[i], arr[index]]; | ||
} | ||
} | ||
|
||
return []; | ||
} | ||
|
||
function binarySearch(arr, key, low, high) { | ||
var mid = 0; | ||
|
||
while (low <= high) { | ||
mid = Math.floor((low + high) / 2); | ||
|
||
if (arr[mid] == key) { | ||
return mid; | ||
} else if (arr[mid] > key) { | ||
high -= 1; | ||
} else if (arr[mid] < key) { | ||
low += 1; | ||
} | ||
} | ||
|
||
return -1; | ||
} | ||
|
||
// 3. 双数组指针扫描 | ||
|
||
/* | ||
* @param {Array} arr 目标数组 | ||
* @param {Number} number 在数组中查找两个数,使得其和为 number | ||
* @example | ||
* var arr = solution3([1, 2], 3); | ||
*/ | ||
function solution3(arr, number) { | ||
var subtraction = arr.map(function (value, index, array) { | ||
return number - value; | ||
}); | ||
|
||
arr.sort(function (a ,b) { | ||
return a - b; | ||
}) | ||
|
||
subtraction.sort(function (a, b) { | ||
return b - a; | ||
}) | ||
|
||
var i = 0, length = arr.length, j = length - 1; | ||
|
||
while (i < length && j > -1) { | ||
if (arr[i] < subtraction[j]) { | ||
i++; | ||
} else if (arr[i] > subtraction[j]) { | ||
j--; | ||
} else { | ||
if (i != j) { | ||
return [arr[i], number - arr[i]]; | ||
} | ||
} | ||
} | ||
|
||
return []; | ||
} | ||
|
||
// 4. 借助 hash | ||
|
||
/* | ||
* @param {Array} arr 目标数组 | ||
* @param {Number} number 在数组中查找两个数,使得其和为 number | ||
* @example | ||
* var arr = solution4([1, 2], 3); | ||
*/ | ||
function solution4(arr, number) { | ||
var hash = {}; | ||
|
||
arr.forEach(function (value, index, array) { | ||
hash[value] = value; | ||
}); | ||
|
||
for (var i = 0, length = arr.length; i < length; i++) { | ||
if (hash[number - arr[i]]) { | ||
return [arr[i], number - arr[i]]; | ||
} | ||
} | ||
|
||
return []; | ||
} | ||
|
||
// 5. 双指针两端扫描 | ||
|
||
/* | ||
* @param {Array} arr 目标数组 | ||
* @param {Number} number 在数组中查找两个数,使得其和为 number | ||
* @example | ||
* var arr = solution5([1, 2], 3); | ||
*/ | ||
function solution5(arr, number) { | ||
var i = 0, j = arr.length - 1; | ||
|
||
arr.sort(function (a, b) { | ||
return a - b; | ||
}) | ||
|
||
while (i < j) { | ||
if (arr[i] + arr[j] > number) { | ||
j--; | ||
} else if (arr[i] + arr[j] < number) { | ||
i++; | ||
} else { | ||
return [arr[i], arr[j]]; | ||
} | ||
} | ||
|
||
return []; | ||
} |
Oops, something went wrong.