# 题目

root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

10
/  \
5   -3
/ \    \
3   2   11
/ \   \
3  -2   1

1.  5 -> 3
2.  5 -> 2 -> 1
3.  -3 -> 11

1.map

2.tree

3.dfs

4.递归

5.先序遍历

# 思路

class Solution {
public:
int pathSum(TreeNode* root, int sum) {
int res = 0;
vector<TreeNode*> out;
helper(root, sum, 0, out, res);
return res;
}
void helper(TreeNode* node, int sum, int curSum, vector<TreeNode*>& out, int& res) {
if (!node) return;
curSum += node->val;
out.push_back(node);
if (curSum == sum) ++res;
int t = curSum;
for (int i = 0; i < out.size() - 1; ++i) {
t -= out[i]->val;
if (t == sum) ++res;
}
helper(node->left, sum, curSum, out, res);
helper(node->right, sum, curSum, out, res);
out.pop_back();
}
};

vector<TreeNode*>& out, int& res  ==> unordered_map<int, int>& m

key的意义是 cur - sum，当 cur - sum == 0时，对应的结果是1个， 即开始就设置 m[0]=1；

• （stl map key如果不存在会自动初始化为0）。

• （比如，假设目标和为8，假设当前节点为x，假设有路径4->4和4->4->1->-1->x则都符合）。
/**
* Definition for a binary tree node.
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int pathSum(TreeNode* root, int sum) {
unordered_map<int, int> m;//memory
m[0] = 1;//cur - sum = 0, return 1。key的意义是 cur - sum，当 cur - sum == 0时，对应的结果是1个
return dfs(root, sum, 0, m);
}

int dfs(TreeNode* node, int sum, int cur, unordered_map<int, int>& m) {
if (!node) {
return 0;
}
cur += node->val;
int ans = m[cur - sum];
++m[cur];
ans += dfs(node->left, sum, cur, m) + dfs(node->right, sum, cur, m);
--m[cur];
return ans;
}
};

# 问题

## 2.std::unordered_map <unordered_map>

template < class Key,                                    // unordered_map::key_type
class T,                                      // unordered_map::mapped_type
class Hash = hash<Key>,                       // unordered_map::hasher
class Pred = equal_to<Key>,                   // unordered_map::key_equal
class Alloc = allocator< pair<const Key,T> >  // unordered_map::allocator_type
> class unordered_map;

Unordered maps are associative containers that store elements formed by the combination of a key value and a mapped value, and which allows for fast retrieval of individual elements based on their keys.

In an unordered_map, the key value is generally used to uniquely identify the element, while the mapped value is an object with the content associated to this key. Types of key and mapped value may differ.

Internally, the elements in the unordered_map are not sorted in any particular order with respect to either their key or mapped values, but organized into buckets depending on their hash values to allow for fast access to individual elements directly by their key values (with a constant average time complexity on average).

unordered_map containers are faster than map containers to access individual elements by their key, although they are generally less efficient for range iteration through a subset of their elements.

Unordered maps implement the direct access operator (operator[]) which allows for direct access of the mapped value using its key value as argument.

Iterators in the container are at least forward iterators.

### Container properties

Associative

Elements in associative containers are referenced by their key and not by their absolute position in the container.

Unordered

Unordered containers organize their elements using hash tables that allow for fast access to elements by their key.

Map

Each element associates a key to a mapped value: Keys are meant to identify the elements whose main content is the mapped value.

Unique keys

No two elements in the container can have equivalent keys.

Allocator-aware

The container uses an allocator object to dynamically handle its storage needs.

# Template parameters

Key

Type of the key values. Each element in an unordered_map is uniquely identified by its key value.
Aliased as member type unordered_map::key_type.

T

Type of the mapped value. Each element in an unordered_map is used to store some data as its mapped value.
Aliased as member type unordered_map::mapped_type. Note that this is not the same as unordered_map::value_type(see below).

Hash

A unary function object type that takes an object of type key type as argument and returns a unique value of type size_t based on it. This can either be a class implementing a function call operator or a pointer to a function (see constructor for an example). This defaults to hash<Key>, which returns a hash value with a probability of collision approaching 1.0/std::numeric_limits<size_t>::max().
The unordered_map object uses the hash values returned by this function to organize its elements internally, speeding up the process of locating individual elements.
Aliased as member type unordered_map::hasher.

Pred

A binary predicate that takes two arguments of the key type and returns a bool. The expression pred(a,b), where pred is an object of this type and a and b are key values, shall return true if a is to be considered equivalent to b. This can either be a class implementing a function call operator or a pointer to a function (see constructor for an example). This defaults to equal_to<Key>, which returns the same as applying the equal-to operator (a==b).
The unordered_map object uses this expression to determine whether two element keys are equivalent. No two elements in an unordered_map container can have keys that yield true using this predicate.
Aliased as member type unordered_map::key_equal.

Alloc

Type of the allocator object used to define the storage allocation model. By default, the allocator class template is used, which defines the simplest memory allocation model and is value-independent.
Aliased as member type unordered_map::allocator_type.

In the reference for the unordered_map member functions, these same names (KeyTHashPred and Alloc) are assumed for the template parameters.

Iterators to elements of unordered_map containers access to both the key and the mapped value. For this, the class defines what is called its value_type, which is a pair class with its first value corresponding to the const version of the key type (template parameter Key) and its second value corresponding to the mapped value (template parameter T):

typedef pair<const Key, T> value_type;

Iterators of a unordered_map container point to elements of this value_type. Thus, for an iterator called it that points to an element of a map, its key and mapped value can be accessed respectively with:

unordered_map<Key,T>::iterator it;
(*it).first; // the key value (of type Key)
(*it).second; // the mapped value (of type T)
(*it); // the "element value" (of type pair<const Key,T>)


Naturally, any other direct access operator, such as -> or [] can be used, for example:

it->first; // same as (*it).first (the key value)
it->second; // same as (*it).second (the mapped value)

## 3.function template  <string>  std::stoi

template<class ForwardIterator, class T>
void iota(ForwardIterator first, ForwardIterator last, T value)
{
while(first != last) {
*first++ = value;
++value;
}
}

#include <algorithm>
#include <iostream>
#include <list>
#include <numeric>
#include <random>
#include <vector>

int main()
{
std::list<int> l(10);
std::iota(l.begin(), l.end(), -4);

std::vector<std::list<int>::iterator> v(l.size());
std::iota(v.begin(), v.end(), l.begin());

std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()});

std::cout << "Contents of the list: ";
for(auto n: l) std::cout << n << ' ';
std::cout << '\n';

std::cout << "Contents of the list, shuffled: ";
for(auto i: v) std::cout << *i << ' ';
std::cout << '\n';
}
可能的输出
Contents of the list: -4 -3 -2 -1 0 1 2 3 4 5
Contents of the list, shuffled: 0 -1 3 4 -4 1 -2 -3 2 5

## 5.function template <algorithm> std::find_if

template<class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) return first;
++first;
}
return last;
}

// find_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector

bool IsOdd (int i) {
return ((i%2)==1);
}

int main () {
std::vector<int> myvector;

myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55);

std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
std::cout << "The first odd value is " << *it << '\n';

return 0;
}
The first odd value is 25

# 6.std::basic_string::substr

basic_string substr( size_type pos = 0,
size_type count = npos ) const;

## 7.C++ 具名要求： Predicate

• std::all_of 、 std::any_of 、 std::none_of 接收元素范围和谓词为输入。在每个单独的输入元素上调用谓词，并且若谓词分别对全部/任一/无元素返回 true 则返回 true 。
• std::find_if 接受元素序列和谓词。返回序列中的首个谓词对其返回的 true 的元素。

## 8.如何调用另一个cpp文件中的子函数

在A中声明一个c函数头就行，链接程序会自动找到B.obj中的c函数的

A.cpp
int c();声明
main()
{
}

B.cpp
int c()定义
{
}

posted @ 2019-02-13 23:51  lightmare  阅读(...)  评论(... 编辑 收藏