class Trie {
public:
bool ed;
Trie* next[ 26 ] ;
Trie ( ) {
memset ( next, 0 , sizeof next) ;
ed= 0 ;
}
void insert ( string word) {
Trie* rt= this;
for ( char v: word) {
if ( ! rt-> next[ v- 'a' ] ) rt-> next[ v- 'a' ] = new Trie ( ) ;
rt= rt-> next[ v- 'a' ] ;
}
rt-> ed= 1 ;
}
bool search ( string word) {
Trie* rt= this;
for ( char v: word) {
if ( ! rt-> next[ v- 'a' ] ) return 0 ;
rt= rt-> next[ v- 'a' ] ;
}
return rt-> ed== 1 ;
}
bool startsWith ( string prefix) {
Trie* rt= this;
for ( char v: prefix) {
if ( ! rt-> next[ v- 'a' ] ) return 0 ;
rt= rt-> next[ v- 'a' ] ;
}
return 1 ;
}
} ;
typedef long long ll;
class Solution {
public:
int get ( ll c1, ll c2, ll n) {
int ans= 0 ;
while ( c1<= n) {
ans= ans+ min ( c2, n+ 1 ) - c1;
c1* = 10 , c2* = 10 ;
}
return ans;
}
int findKthNumber ( int n, int k) {
int cur= 1 ;
k-- ;
int ans= 0 ;
while ( k) {
int num= get ( cur, cur+ 1 , n) ;
if ( num<= k) {
cur++ ;
k- = num;
}
else {
k-- ;
cur* = 10 ;
}
}
return cur;
}
} ;
参考:
class Solution {
public :
int c[ 10 ] ;
void upd ( int x, int v) {
for ( int i= x; i< 10 ; i+ = ( i& ( - i) ) ) c[ i] + = v;
}
int ask ( int x) {
int ans= 0 ;
for ( int i= x; i; i- = ( i& ( - i) ) ) ans= ans+ c[ i] ;
return ans;
}
int query ( int k, int n) {
int l= 1 , r= n, ans= l;
while ( l<= r) {
int mid= ( l+ r) / 2 ;
if ( ask ( mid) >= k) r= mid- 1 , ans= mid;
else l= mid+ 1 ;
}
return ans;
}
string getPermutation ( int n, int k) {
vector< int > fac ( n+ 1 , 0 ) , vis ( n+ 1 , 0 ) ;
fac[ 0 ] = 1 ;
for ( int i= 1 ; i<= n; i++ ) fac[ i] = fac[ i- 1 ] * i, upd ( i, 1 ) ;
string ans;
k-- ;
for ( int i= n- 1 ; i>= 0 ; i-- ) {
int x= ( k/ fac[ i] ) + 1 ;
x= query ( x, n) ;
upd ( x, - 1 ) ;
ans= ans+ char ( x+ '0' ) ;
k= k% fac[ i] ;
}
return ans;
}
} ;
class Solution {
public :
bool ismatch ( int i, int j, string & s, string & p) {
if ( p[ j- 1 ] == '.' ) return 1 ;
return s[ i- 1 ] == p[ j- 1 ] ;
}
bool isMatch ( string s, string p) {
int n= s. size ( ) , m= p. size ( ) ;
vector< vector< int > > dp ( n+ 1 , vector< int > ( m+ 1 , 0 ) ) ;
dp[ 0 ] [ 0 ] = 1 ;
for ( int i= 0 ; i<= n; i++ ) {
for ( int j= 1 ; j<= m; j++ ) {
if ( p[ j- 1 ] == '*' ) {
if ( j>= 2 ) dp[ i] [ j] | = dp[ i] [ j- 2 ] ;
if ( i>= 1 && ismatch ( i, j- 1 , s, p) ) dp[ i] [ j] | = dp[ i- 1 ] [ j] ;
}
else {
if ( i>= 1 && ismatch ( i, j, s, p) ) dp[ i] [ j] | = dp[ i- 1 ] [ j- 1 ] ;
}
}
}
return dp[ n] [ m] ;
}
} ;
class Solution {
public :
bool isok ( string & s, string & p, int i, int j) {
if ( p[ j- 1 ] == '?' || s[ i- 1 ] == p[ j- 1 ] ) return 1 ;
return 0 ;
}
bool isMatch ( string s, string p) {
int n= s. size ( ) , m= p. size ( ) ;
vector< vector< int > > dp ( n+ 1 , vector< int > ( m+ 1 , 0 ) ) ;
dp[ 0 ] [ 0 ] = 1 ;
int j= 0 ;
while ( j< m&& p[ j] == '*' ) dp[ 0 ] [ j+ 1 ] = 1 , j++ ;
for ( int i= 1 ; i<= n; i++ ) {
for ( int j= 1 ; j<= m; j++ ) {
if ( p[ j- 1 ] == '*' ) {
dp[ i] [ j] | = dp[ i] [ j- 1 ] ;
dp[ i] [ j] | = dp[ i- 1 ] [ j] ;
}
else {
if ( isok ( s, p, i, j) ) dp[ i] [ j] | = dp[ i- 1 ] [ j- 1 ] ;
}
}
}
return dp[ n] [ m] ;
}
} ;
class bigheap {
public :
vector< int > a;
int sz= 0 ;
void push ( int x) {
++ sz;
a. push_back ( x) ;
int cur= sz;
while ( cur> 1 ) {
int fa= cur/ 2 ;
if ( a[ fa] < a[ cur] ) {
swap ( a[ fa] , a[ cur] ) ;
} else break ;
cur= fa;
}
}
int top ( ) {
return a[ 1 ] ;
}
void pop ( ) {
swap ( a[ 1 ] , a[ sz-- ] ) ;
a. pop_back ( ) ;
int cur= 1 ;
while ( cur* 2 <= sz) {
int son= cur* 2 ;
if ( son+ 1 <= sz&& a[ son+ 1 ] > a[ son] ) son++ ;
if ( a[ cur] < a[ son] ) swap ( a[ cur] , a[ son] ) ;
else break ;
cur= son;
}
}
bigheap ( ) {
a. clear ( ) ;
a. push_back ( - 1 ) ;
}
} ;
class smallheap {
public :
vector< int > a;
int sz= 0 ;
void push ( int x) {
++ sz;
a. push_back ( x) ;
int cur= sz;
while ( cur> 1 ) {
int fa= cur/ 2 ;
if ( a[ fa] > a[ cur] ) {
swap ( a[ fa] , a[ cur] ) ;
} else break ;
cur= fa;
}
}
int top ( ) {
return a[ 1 ] ;
}
void pop ( ) {
swap ( a[ 1 ] , a[ sz-- ] ) ;
a. pop_back ( ) ;
int cur= 1 ;
while ( cur* 2 <= sz) {
int son= cur* 2 ;
if ( son+ 1 <= sz&& a[ son+ 1 ] < a[ son] ) son++ ;
if ( a[ cur] > a[ son] ) swap ( a[ cur] , a[ son] ) ;
else break ;
cur= son;
}
}
smallheap ( ) {
a. clear ( ) ;
a. push_back ( - 1 ) ;
}
} ;
class MedianFinder {
public :
bigheap L;
smallheap R;
MedianFinder ( ) {
}
void addNum ( int num) {
if ( L. sz== R. sz) {
R. push ( num) ;
int x= R. top ( ) ;
R. pop ( ) ;
L. push ( x) ;
} else {
L. push ( num) ;
int x= L. top ( ) ;
L. pop ( ) ;
R. push ( x) ;
}
int x= L. top ( ) , y= R. top ( ) ;
}
double findMedian ( ) {
if ( L. sz== R. sz) {
return 1.0 * ( L. top ( ) + R. top ( ) ) / 2 ;
} else return L. top ( ) ;
}
} ;
# [ 寻找两个正序数组的中位数] ( https: / / leetcode- cn. com/ problems/ median- of- two- sorted- arrays/ )
```cpp
class Solution {
public :
int solve ( vector< int > & a, int l, int r, vector< int > & b, int ql, int qr, int k) {
if ( l> r) return b[ ql+ k- 1 ] ;
if ( ql> qr) return a[ l+ k- 1 ] ;
int mid= ( l+ r) / 2 ;
int qmid= ( ql+ qr) / 2 ;
int num= mid- l+ 1 + qmid- ql+ 1 ;
if ( a[ mid] < b[ qmid] ) {
if ( num> k) return solve ( a, l, r, b, ql, qmid- 1 , k) ;
else return solve ( a, mid+ 1 , r, b, ql, qr, k- ( mid- l+ 1 ) ) ;
}
else {
if ( num> k) return solve ( a, l, mid- 1 , b, ql, qr, k) ;
else return solve ( a, l, r, b, qmid+ 1 , qr, k- ( qmid- ql+ 1 ) ) ;
}
}
double findMedianSortedArrays ( vector< int > & nums1, vector< int > & nums2) {
int n= nums1. size ( ) , m= nums2. size ( ) ;
if ( ( n+ m) & 1 ) return solve ( nums1, 0 , n- 1 , nums2, 0 , m- 1 , ( n+ m+ 1 ) / 2 ) ;
else return 1.0 * ( solve ( nums1, 0 , n- 1 , nums2, 0 , m- 1 , ( n+ m+ 2 ) / 2 ) + solve ( nums1, 0 , n- 1 , nums2, 0 , m- 1 , ( n+ m) / 2 ) ) / 2 ;
}
} ;