# é¢è¯å¸¸è§æææ¨¡æ¿é¢ä»¥åç¬è¯æ¨¡æ¿æ»ç»(é另尿°ACMå
¥é¨ç®æ³)
ç°å¨å¤§é¨å大åçç¬è¯é¢è¯è¶æ¥è¶éè§ç®æ³ãç¹å«æ¯ç¬è¯é¢éé¢ï¼å¤§é¨åé¢ååACMå ä¹ä¸æ ·ã
æä»¥æå¨è¿éæ»ç»äºä¸äº(30个)常è§é¢è¯åACM**å
¥é¨çº§å«**çç®æ³æ¨¡æ¿ï¼å
¶å®ä¹ä¸åªæ¯ACMè¦æ±ï¼å¤§é¨å模æ¿é½å¯ä»¥å¨`LeetCode`䏿¾å°å¯¹åºçé¢åï¼ï¼æä¸é¨å乿¯é¢è¯æ¶åé¢è¯å®ç»å¸¸è¦ä½ ææçç»å
¸ç®æ³ãä¾å¦æåºãäºåæ ééå½éåãäºåã大æ°çã
**å¯è½è¿äºç®æ³æäºå¯¹åå¦è
æç¹é¾åº¦ï¼ä½æ¯ä¸è¦æ
ï½...ï½ï¼æå¨æ¯ä¸ªç®æ³ä»£ç ç䏿¹é½ç»äºä¸ä¸ªé¾æ¥ï¼æ¯ä¸ªç®æ³å ä¹é½æå¾è¯¦ç»çè§£é(大é¨å带å¾ï¼æäºæ¯æåçï¼æäºæ¯æçå°çå¾å¥½çæç« )ï¼ä¸æçå¯ä»¥ç¹é¾æ¥è¿è¡å¦ä¹ ï¼å¦å¤æäºæ¨¡æ¿é
äºåé¢ï¼å¯ä»¥éªè¯ç®æ³æ£ç¡®æ§ãç¥å¤§å®¶å¨ç¬è¯é¢è¯ææç®æ³é¡ºå©ãã^_^**ã
å½ç¶è¿äºåªæ¯æä»¬å·é¢çåºç¡å模æ¿ï¼**æ´å¤çè¿æ¯éè¦æä»¬å¤å¤å·é¢**ï¼é»ç¼é»è¾æç»´åæè§ï½...ï½ã
è¯è¨ç¨çJavaï¼ä½æ¯å¤§é¨å代ç åC++åºæ¬ä¸æ²¡å¥å¾å¤§åºå«ï½...ï½ã
**妿è§å¾æ»ç»çè¿ä¸éçè¯ï¼ç»ä¸ª`star`å¦*â¯3â°Â .**
> ä»åºä¼ä¸ææ´æ°åå®åæ°çç¬è¯é¢è¯ä¸åºç°ç模æ¿^_^ã
>
> ç±äºè¿æ®µæ¶é´é常å¿ï¼C++çæ¬æ²¡æè·ä¸ï¼æå
´è¶£çå¯ä»¥å
çæä¹ååç[ACMC++模æ¿](https://blog.csdn.net/zxzxzx0119/article/details/79838261)ï¼å颿æ¶é´æä¼è¡¥ä¸^_^ã
## ç®å½
* [ä¸ãæåº](#䏿åº)
* [äºãäºå](#äºäºå)
* [ä¸ãäºåæ ééå½éå](#ä¸äºåæ ééå½éå)
* [åã01èå
](#å01èå
)
* [äºãæé¿éå¢ååºå](#äºæé¿éå¢ååºå)
* [å
ãæé¿å
Œ
±ååºå](#å
æé¿å
Œ
±ååºå)
* [ä¸ãæé¿å
Œ
±å串](#䏿é¿å
Œ
±å串)
* [å
«ã大æ°å æ³](#å
«å¤§æ°å æ³)
* [ä¹ã大æ°ä¹æ³](#ä¹å¤§æ°ä¹æ³)
* [åã大æ°é¶ä¹](#å大æ°é¶ä¹)
* [åä¸ãå
¨æå](#åä¸å
¨æå)
* [åäºãåé](#åäºåé)
* [åä¸ãNçå](#åä¸nçå)
* [ååãå¹¶æ¥é](#ååå¹¶æ¥é)
* [åäºãæ ç¶æ°ç»](#åäºæ ç¶æ°ç»)
* [åå
ã线段æ ](#åå
线段æ )
* [åä¸ãåå
¸æ ](#åä¸åå
¸æ )
* [åå
«ãåè°æ ](#åå
«åè°æ )
* [åä¹ãåè°éå](#åä¹åè°éå)
* [äºåãKMP](#äºåkmp)
* [äºåä¸ãManacherç®æ³](#äºåä¸manacherç®æ³)
* [äºåäºãæææåº](#äºåäºæææåº)
* [äºåä¸ãæå°çææ ](#äºå䏿å°çææ )
* [äºååãæçè·¯](#äºååæçè·¯)
* [äºåäºã欧æåè·¯](#äºåäºæ¬§æåè·¯)
* [äºåå
ãGCDåLCM](#äºåå
gcdålcm)
* [äºåä¸ãç´ æ°çæ³](#äºåä¸ç´ æ°çæ³)
* [äºåå
«ãå¯ä¸åè§£å®ç](#äºåå
«å¯ä¸åè§£å®ç)
* [äºåä¹ã乿³å¿«éå¹](#äºåä¹ä¹æ³å¿«éå¹)
* [ä¸åãç©éµå¿«éå¹](#ä¸åç©éµå¿«éå¹)
## Javaå¿«éè¾å
¥
å
ç»ä¸ä¸ªå¹²è´§ï¼å¯è½æäºé¢ç¨Javaä¼è¶
æ¶ï¼å¾å°ï¼ï¼ä¸é¢æ¯[Petr](https://en.wikipedia.org/wiki/Petr_Mitrichev)å·é¢æ¶ç模æ¿ï¼ä¸è¬ç¨äºè¿ä¸ªå°±ä¸ä¼åºç°C++è½è¿Javaä¸è½è¿çæ
åµäºã
```java
import java.io.*;
import java.util.*;
public class Main {
static class FR {
BufferedReader br;
StringTokenizer tk;
FR(InputStream stream) {
br = new BufferedReader(new InputStreamReader(stream), 32768);
tk = null;
}
String next() {
while (tk == null || !tk.hasMoreElements()) {
try {
tk = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return tk.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
}
static void solve(InputStream stream, PrintWriter out) {
FR in = new FR(stream);
// start code.....
}
public static void main(String[] args) {
OutputStream os = System.out;
InputStream is = System.in;
PrintWriter out = new PrintWriter(os);
solve(is, out);
out.close(); // ä¸å
³é就没æè¾åº
}
}
```
## ä¸ãæåº
å
ç»åºä¸ä¸ªswap彿°ï¼ä»£è¡¨äº¤æ¢æ°ç»ä¸¤ä¸ªä½ç½®çå¼ï¼å¾å¤æåºç¨å°è¿ä¸ªå½æ°:
```java
static void swap(int[] arr, int a, int b){
int t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
```
é¢è¯ä¸»è¦èå¯**æ¯è¾æåº**(`O(N^2)ãO(NlogN)`)æåº(éæ¯è¾æåºå¯ä»¥çä¸é¢çè¯¦ç»æ»ç»)ãç»åºä¸¤ç¯å客:
* [åç§æåºç®æ³æ»ç»](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Algorithm/Sort/%E5%90%84%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93(%E5%85%A8%E9%9D%A2).md)ï¼
* [å¨å¾æå®æåºç®æ³](https://mp.weixin.qq.com/s/vn3KiV-ez79FmbZ36SX9lg)ï¼
### 1ãåæ³¡
```java
static void bubbleSort(int[] arr){
for(int end = arr.length - 1; end > 0; end--){
boolean isSort = true;
for(int i = 0; i < end; i++){
if(arr[i] > arr[i+1]) {
swap(arr, i, i + 1);
isSort = false;
}
}
if(isSort) break;
}
}
```
### 2ãéæ©
```java
static void selectSort(int[] arr){
for(int i = 0; i < arr.length; i++){
int minIdx = i;
for(int j = i + 1; j < arr.length; j++) minIdx = arr[j] < arr[minIdx] ? j : minIdx;
swap(arr, minIdx, i);
}
}
```
### 3ãæå
¥
```java
// å 个边ç: i=1å¼å§(䏿¯å¿
é¡»)ãj >= 0, arr[j+1] = key注æä¸ä¸
static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int key = arr[i], j;
for (j = i - 1; j >= 0 && arr[j] > key; j--) arr[j + 1] = arr[j];
arr[j + 1] = key;
}
}
```
第äºç§åæ³:
```java
// è¾¹ç j > 0
static void insertSort2(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j - 1] > arr[j]; j--) swap(arr, j, j - 1);
}
}
```
äºåæå
¥æåº:
```java
// 注æ R = i-1ï¼æ³¨ææ¾ç¬¬ä¸ä¸ª>=keyçï¼æ³¨æarr[i]å
ç¨keyä¿å
static void binaryInsertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int L = 0, R = i - 1;
// æ¾ç¬¬ä¸ä¸ªå¤§äºç äºåè¾¹çæä¸æ¸
ççä¸é¢çäºå龿¥
int key = arr[i];
while (L <= R) {
int m = L + (R - L) / 2;
if (arr[m] > arr[i]) {
R = m - 1;
} else {
L = m + 1;
}
}
for (int j = i - 1; j >= L; j--) arr[j + 1] = arr[j];
arr[L] = key;
}
}
```
### 4ãå¸å°æåº
éåçæ¯**å¢éåºåæ¯æ¬¡åå**ççç¥ã
```java
static void shellSort(int[] arr) {
for (int g = arr.length; g > 0; g /= 2) { // å¢éåºå gap
for (int end = g; end < arr.length; end++) { // æ¯ä¸ä¸ªç»çç»æå
ç´ , 仿°ç»ç¬¬gap个å
ç´ å¼å§
// æ¯ç»åæå
¥æåº
int key = arr[end], i;
for (i = end - g; i >= 0 && key < arr[i]; i -= g) arr[i + g] = arr[i];
arr[i + g] = key;
}
}
}
```
### 5ãå¿«æ
ç»åºçæ¯ä¸è·¯å¿«æï¼å
¶ä»ççæç»çå客ã
```java
static void quickSort(int[] arr){
if(arr == null || arr.length == 0) return;
quickRec(arr, 0, arr.length - 1);
}
static void quickRec(int[] arr, int L, int R) {
if (L >= R) return;
swap(arr, L, L + (int) (Math.random() * (R - L + 1)));
int[] p = partition(arr, L, R);
quickRec(arr, L, p[0] - 1);
quickRec(arr, p[1] + 1, R);
}
// ç¨arr[L]ä½ä¸ºååç¹
static int[] partition(int[] arr, int L, int R) {
int key = arr[L];
int less = L, more = R + 1;
int cur = L + 1;
while (cur < more) {
if (arr[cur] < key) {
swap(arr, ++less, cur++);
} else if (arr[cur] > key) {
swap(arr, --more, cur);
} else {
cur++;
}
}
swap(arr, L, less);
// è¿åç¸ççä¸¤ä¸ªä¸æ ï¼ãlessä½ç½®æ¯ææå交æ¢è¿æ¥çååå¼ï¼moreä½ç½®æ¯>çï¼æä»¥è¿åmore-1
return new int[]{less, more - 1};
}
```
### 6ãå½å¹¶æåº
```java
static void mergeSort(int[] arr){
if(arr == null || arr.length == 0) return;
mergeRec(arr, 0, arr.length - 1);
}
//æ³¨ææ¯mergeSort(arr, L, m); 䏿¯mergeSort(arr, L, m-1)
static void mergeRec(int[] arr, int L, int R) {
if (L >= R) return;
int m = L + (R - L) / 2;
mergeRec(arr, L, m);
mergeRec(arr, m + 1, R);
merge(arr, L, m, R);
}
static void merge(int[] arr, int L, int mid, int R) {
int[] h = new int[R - L + 1];
int p1 = L, p2 = mid + 1;
int k = 0;
while (p1 <= mid && p2 <= R)
h[k++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++]; // 注æä¿è¯ç¨³å®æ§
while (p1 <= mid) h[k++] = arr[p1++];
while (p2 <= R) h[k++] = arr[p2++];
for (int i = 0; i < k; i++) arr[L + i] = h[i];
}
```
ééå½å½å¹¶æåº:
```java
static void mergeSortBU(int[] arr) {
for (int sz = 1; sz <= arr.length; sz += sz) { // åºé´ç个æ°ï¼1..2..4..8
for (int i = 0; sz + i < arr.length; i += sz + sz) { // 对[i...i+sz-1]å[i+sz...i+2*sz-1]å
å½å¹¶
merge(arr, i, i + sz - 1, Math.min(arr.length - 1, i + 2 * sz - 1)); // min鲿¢è¶ç
}
}
}
```
### 7ãå æ
```java
// if(arr == null || arr.length <= 1) return; æ¯å¿
é¡»ç
static void heapSort(int[] arr) {
if (arr == null || arr.length <= 1) return;
for (int i = 0; i < arr.length; i++) siftUp(arr, i);//䏿µ®æ¹å¼å»ºå
int size = arr.length - 1;
swap(arr, 0, size);
while (size > 0) {
siftDown(arr, 0, size);
swap(arr, 0, --size);
}
}
// 䏿µ®
static void siftUp(int[] arr, int i) {
while (arr[i] > arr[(i - 1) / 2]) {
swap(arr, i, (i - 1) / 2);
i = (i - 1) / 2;
}
}
// 䏿²
static void siftDown(int[] arr, int i, int heapSize) {
int L = 2 * i + 1;
while (L < heapSize) {
int maxIndex = L + 1 < heapSize && arr[L + 1] > arr[L] ? L + 1 : L;
maxIndex = arr[i] > arr[maxIndex] ? i : maxIndex;
if (maxIndex == i) break;
swap(arr, i, maxIndex);
i = maxIndex;
L = 2 * i + 1;
}
}
```
第äºç§æ¹å¼ï¼ä½¿ç¨`heapfiy`çä¼åï¼åªéè¦ä½¿ç¨`siftDown`è¿ç¨å³å¯ã
```java
// 注æè¿éæ¯size+1,å 为è¿ä¸ªä¸æ¯äº¤æ¢äºæåä¸ä¸ªï¼æä»¥è¦èèarr[size]ï¼ä¸é¢ä¸è¦èèarr[size]
// if (arr == null || arr.length <= 1) return; æ¯å¿
é¡»ç
static void heapSort2(int[] arr) {
if (arr == null || arr.length <= 1) return;
int size = arr.length - 1;
for (int i = (size - 1) / 2; i >= 0; i--)
siftDown(arr, i, size + 1);
swap(arr, 0, size);
while (size > 0) {
siftDown(arr, 0, size);
swap(arr, 0, --size);
}
}
```
å
¶ä¸`siftDown`è¿ç¨ä¹å¯ä»¥ä½¿ç¨éå½çåæ³:
```java
static void siftDown(int[] arr, int i, int heapSize) { //ä»arr[i] å¼å§å¾ä¸è°æ´
int L = 2 * i + 1;
int R = 2 * i + 2;
int maxIdx = i;
if (L < heapSize && arr[L] > arr[maxIdx]) maxIdx = L;
if (R < heapSize && arr[R] > arr[maxIdx]) maxIdx = R;
if (maxIdx != i) {
swap(arr, i, maxIdx);
siftDown(arr, maxIdx, heapSize);
}
}
```
## äºãäºå
ç»åºæç[å¦ä¸ç¯æç« ](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Algorithm/BinarySearch/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E7%9A%84%E6%80%BB%E7%BB%93(6%E7%A7%8D%E5%8F%98%E5%BD%A2).md)ï¼æå
³äºäºåç详ç»è®²è§£ã
äºåæä¸»è¦çå°±æ¯è¾¹çé®é¢:
* 第ä¸ä¸ª`=key`çï¼ä¸åå¨è¿å`-1`ï¼
* 第ä¸ä¸ª`>=key`çï¼
* 第ä¸ä¸ª`>key`çï¼
* æåä¸ä¸ª`=key`çï¼
* æåä¸ä¸ª`<=key`çï¼
* æåä¸ä¸ª` key)
R = mid - 1;
else
L = mid + 1;
}
return -1;
}
```
**å£è¯: 左边çå
R(`if`åç)ï¼å³è¾¹çå
L**ã
æ¥æ¾ç¬¬ä¸ä¸ª`=key`çï¼ä¸åå¨è¿å`-1`:
```java
// 左边çä¸ä¸ªï¼ æ³¨ææ¯L < arr.length
static int firstEqual(int[] arr, int key){
int L = 0, R = arr.length - 1;
while(L <= R){
int mid = L + (R - L) / 2;
if(arr[mid] >= key)
R = mid - 1;
else
L = mid + 1;
}
if(L < arr.length && arr[L] == key) return L;
return -1;
}
```
第ä¸ä¸ª`>=key`ç:
```java
static int firstLargeEqual(int[] arr, int key){
int L = 0, R = arr.length - 1;
while(L <= R){
int mid = L + (R - L) / 2;
if(arr[mid] >= key)
R = mid - 1;
else
L = mid + 1;
}
return L;
}
```
第ä¸ä¸ª`>key`ç:
```java
static int firstLarge(int[] arr, int key){
int L = 0, R = arr.length - 1;
while(L <= R){
int mid = L + (R - L) / 2;
if(arr[mid] > key) // å 为æ¯ç¬¬ä¸ä¸ª> çï¼æä»¥>
R = mid - 1;
else
L = mid + 1;
}
return L;
}
```
æåä¸ä¸ª`=key`ç:
```java
// å³è¾¹çä¸ä¸ª æ³¨ææ¯ R>=0
static int lastEqual(int[] arr, int key){
int L = 0, R = arr.length - 1;
while(L <= R){
int mid = L + (R - L) / 2;
if(arr[mid] <= key)
L = mid + 1;
else
R = mid - 1;
}
if(R >= 0 && arr[R] == key)
return R;
return -1;
}
```
æåä¸ä¸ª`<=key`ç:
```java
static int lastEqualSmall(int[] arr, int key){
int L = 0, R = arr.length - 1;
while(L <= R){
int mid = L + (R - L) / 2;
if(arr[mid] <= key)
L = mid + 1;
else
R = mid - 1;
}
return R;
}
```
æåä¸ä¸ª`= arr.length || arr[i] == -1) return null;
Node root = new Node(arr[i]);
root.left = buildTree(arr, i * 2 + 1);
root.right = buildTree(arr, i * 2 + 2);
return root;
}
static Node buildTree(Scanner in){
Node root = null;
int val = in.nextInt();
if(val != -1){
root = new Node(val);
root.left = buildTree(in);
root.right = buildTree(in);
}
return root;
}
//ååº
static void preOrder(Node root){
if(root == null) return;
Stack stack = new Stack<>();
Node p = root;
// stack.push(root); // wrong
while(p != null || !stack.isEmpty()){
while(p != null){
out.print(p.val + " ");
stack.push(p); // 注æå
æ¨å
¥
p = p.left;
}
p = stack.pop();
p = p.right;
}
out.println();
}
//ä¸åº
static void inOrder(Node root){
if(root == null) return;
Stack stack = new Stack<>();
Node p = root;
while(p != null || !stack.isEmpty()){
while(p != null){
stack.push(p);
p = p.left;
}
p = stack.pop();
out.print(p.val + " ");
p = p.right;
}
out.println();
}
//ååºç¬¬ä¸ç§: åæ : å¯ä»¥å®ç° ä¸-> å³-> å·¦, ç¶ååç¨ä¸ä¸ªæ é转å³å¯
static void postOrder(Node root){
if(root == null) return;
Node p = root;
Stack s1 = new Stack<>();
Stack s2 = new Stack<>();
s1.push(root);
while(!s1.isEmpty()){
Node cur = s1.pop();
s2.push(cur);
if(cur.left != null ) s1.push(cur.left);
if(cur.right != null ) s1.push(cur.right);
}
while(!s2.isEmpty()) out.print(s2.pop().val + " ");
out.println();
}
// ååºç¬¬äºç§pre
static void postOrder2(Node root){
Stack s = new Stack<>();
s.push(root);
Node pre = null;
while(!s.isEmpty()){
Node cur = s.peek();
if((cur.left == null && cur.right == null) ||
(pre != null && (pre == cur.left || pre == cur.right))){
out.print(cur.val + " ");
s.pop();
pre = cur;
}else {
if(cur.right != null) s.push(cur.right);
if(cur.left != null) s.push(cur.left);
}
}
out.println();
}
public static void main(String[] args){
//int[] arr = {1,2,3,4,5,6,7,8,-1,9,-1,10,-1,11,-1, -1,-1,-1,-1,-1,-1,-1,-1}; // åä¸é¢ä¸æ ·
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, -1, 9, -1, 10, -1, 11, -1};
Node root = buildTree(arr, 0);
preOrder(root);
inOrder(root);
postOrder(root);
postOrder2(root);
// Scanner in = new Scanner(new BufferedInputStream(System.in));
// æ ç»æåä¸é¢ç¸å,è¾å
¥: 1 2 4 8 -1 -1 -1 5 9 -1 -1 -1 3 6 10 -1 -1 -1 7 11 -1 -1 -1
// Node root2 = buildTree(in);
}
}
```
## åã01èå
è¿ä¸ªå¨ç¬è¯é¢ä¸å¯è½ä¼åºç°ï¼ææ¶ååªæ¯åºé¢åºæ¯ä¸åã
åæ ·ä¹ç»åºæç[å¦ä¸ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/Other/Hdu/DP/Hdu%20-%202602.%20Bone%20Collector(01%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98).md)çæ»ç»ã
```java
import java.io.*;
import java.util.*;
/**
* 01èå
* é¢ç®: http://acm.hdu.edu.cn/showproblem.php?pid=2602
*/
public class M4_Knapsack {
static int n, C;
static int[] w, v;
static int[][] dp;
//è®°å¿å
static int rec(int p, int curW) {
if (p == n)
return 0;
if (dp[p][curW] != -1) return dp[p][curW];
if (curW + w[p] > C)
return dp[p][curW] = rec(p + 1, curW);
else
return dp[p][curW] = Math.max(rec(p + 1, curW + w[p]) + v[p],
rec(p + 1, curW));
}
// æ®é
static int dp(){
int[][] dp = new int[n+1][C+1];
for(int i = n - 1; i >= 0; i--){
for(int j = 0; j <= C; j++){
dp[i][j] = j + w[i] > C ? dp[i+1][j] :
Math.max(dp[i+1][j], dp[i+1][j+w[i]]+v[i]);
}
}
return dp[0][0];
}
// äºç»´æ»å¨
static int dp2(){
int[][] dp = new int[2][C+1];
for(int i = n - 1; i >= 0; i--){
for(int j = 0; j <= C; j++){
dp[i&1][j] = j + w[i] > C ? dp[(i+1)&1][j] :
Math.max(dp[(i+1)&1][j], dp[(i+1)&1][j+w[i]]+v[i]);
}
}
return dp[0][0];
}
// ä¸ç»´dp
static int dp3(){
int[] dp = new int[C + 1];
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= C; j++) { // 注æé¡ºåºä¸å®è¦è¿æ ·
dp[j] = j + w[i] > C ? dp[j] : Math.max(dp[j], dp[j + w[i]] + v[i]);
}
}
return dp[0];
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
PrintWriter out = new PrintWriter(System.out);
int T = in.nextInt();
for (int t = 0; t < T; t++) {
n = in.nextInt();
C = in.nextInt();
w = new int[n];
v = new int[n];
for (int i = 0; i < n; i++) v[i] = in.nextInt();
for (int i = 0; i < n; i++) w[i] = in.nextInt();
dp = new int[n][C + 1];
for (int i = 0; i < n; i++) Arrays.fill(dp[i], -1);
// out.println(rec(0, 0));
// out.println(dp());
// out.println(dp2());
out.println(dp3());
out.flush();
}
out.close();
}
}
```
## äºãæé¿éå¢ååºå
è¿ä¸ªä¹æ¯ç¬è¯ä¸å¯è½åºç°åç§çé¢ç®çã
[详ç»è®²è§£å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/LeetCode/DP/LeetCode%20-%20354.%20Russian%20Doll%20Envelopes%E5%8F%8A%E6%9C%80%E9%95%BF%E4%B8%8A%E5%8D%87%E5%AD%90%E5%BA%8F%E5%88%97%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.md)ã
```java
import java.io.PrintWriter;
import java.util.Arrays;
/**
* æé¿å
Œ
±ååºå
* é¢ç®: https://leetcode-cn.com/problems/longest-increasing-subsequence/
*/
public class M5_LIS {
// O(N^2)
public int lengthOfLIS(int[] nums){
if(nums == null || nums.length == 0) return 0;
int[] dp = new int[nums.length];
int res = 1;
for(int i = 0; i < nums.length; i++){
dp[i] = 1;
for(int j = 0; j < i; j++){
if(nums[j] < nums[i])
dp[i] = Math.max(dp[i], dp[j] + 1);
}
res = Math.max(res, dp[i]);
}
return res;
}
// O(N^2)
static int[] getDp(int[] nums){
if(nums == null || nums.length == 0) return new int[]{};
int[] dp = new int[nums.length];
for(int i = 0; i < nums.length; i++){
dp[i] = 1;
for(int j = 0; j < i; j++){
if(nums[j] < nums[i])
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
return dp;
}
static int[] getLIS(int[] arr, int[] dp){
int maxLen = 0, end = 0;
for(int i = 0; i < dp.length; i++) if(dp[i] > maxLen){
maxLen = dp[i];
end = i;
}
int[] lis = new int[maxLen];
lis[--maxLen] = arr[end];
for(int i = end - 1; i >= 0; i--){
if(dp[i] == dp[end] - 1 && arr[i] < arr[end]){
lis[--maxLen] = arr[i];
end = i;
}
}
return lis;
}
// O(N * logN)
public int lengthOfLIS2(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int[] dp = new int[nums.length];
int[] ends = new int[nums.length + 1];
dp[0] = 1;
ends[1] = nums[0];
int right = 1; // [1~right]为ææåºãendsæ°ç»æ¯æåºç(ååº), rightæ¯å³è¾¹ç
int L, mid, R;
for (int i = 1; i < nums.length; i++) {
L = 1;
R = right;
// æ¾å°ç¬¬ä¸ä¸ª>=arr[i]çï¼è¿åç»ææ¯ L
while (L <= R) {
mid = L + (R - L) / 2;
if (ends[mid] >= nums[i])
R = mid - 1;
else
L = mid + 1;
}
// 说æä»¥arr[i]以arr[i]ç»å°¾çæé¿éå¢ååºå=endsåºææé¿åº¦+1
if (L > right) { //æ²¡ææ¾å°arr[i]æ¯æé¿ç (å ä¸ºä¸æ ä»1å¼å§ï¼æä»¥å¤ææ¯>right),
dp[i] = right + 1;
ends[right + 1] = nums[i]; // æ©å¤§endsæ°ç»
right += 1; //æ©å¤§ææåº
} else { // æ¾å°äºarr[l] > arr[i], æ´æ°end[l] = arr[i] ,表示lé¿åº¦çæé¿ååºåç»å°¾å¯ä»¥æ´æ°ä¸ºarr[i]
dp[i] = right; // dp[i]è¿æ¯æ²¡æå é¿
ends[L] = nums[i];
}
}
return right;
}
public static void main(String[] args){
PrintWriter out = new PrintWriter(System.out);
int[] arr = {10,9,2,5,3,7,101,18};
out.println(Arrays.toString(getLIS(arr, getDp(arr))));
out.close();
}
}
```
## å
ãæé¿å
Œ
±ååºå
乿¯ç¬è¯ä¸å¯è½åºç°çç»å
¸DPé¢ç®ã
[详ç»è®²è§£å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/DP/51Nod%20-%201006.%20%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97LCS%20%E5%92%8C%20%E6%9C%80%E9%95%BF%E5%85%AC%E4%BC%97%E5%AD%90%E4%B8%B2.md)
```java
import java.io.BufferedInputStream;
import java.util.Scanner;
/**
* æé¿å
Œ
±å串
* é¢ç®: http://www.51nod.com/Challenge/Problem.html#!#problemId=1006
*/
public class M6_LCS {
/**
* dp[i][j]ä»£è¡¨çæ¯ str[0..i]ä¸str[0...j]çæé¿å
Œ
±ååºå
*/
static int[][] getDp(char[] s1, char[] s2) {
int n1 = s1.length, n2 = s2.length;
int[][] dp = new int[n1][n2];
dp[0][0] = s1[0] == s2[0] ? 1 : 0;
for (int i = 1; i < n1; i++) // 䏿¦dp[i][0]被设置æ1,ådp[i~N-1][0]é½ä¸º1
dp[i][0] = Math.max(dp[i - 1][0], s1[i] == s2[0] ? 1 : 0);
for (int j = 1; j < n2; j++)
dp[0][j] = Math.max(dp[0][j - 1], s2[j] == s1[0] ? 1 : 0);
for (int i = 1; i < n1; i++) {
for (int j = 1; j < n2; j++) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
if (s1[i] == s2[j]) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - 1] + 1);
}
}
}
return dp;
}
static String getLCS(char[] s1, char[] s2, int[][] dp) {
if(s1 == null || s1.length == 0 || s2 == null || s2.length == 0)
return "";
int i = s1.length - 1;
int j = s2.length - 1;
char[] res = new char[dp[i][j]]; //çæçæ¡çæ°ç»
int index = dp[i][j] - 1;
while (index >= 0) {
if (i > 0 && dp[i][j] == dp[i - 1][j]) {
i--;
} else if (j > 0 && dp[i][j] == dp[i][j - 1]) {
j--;
} else { // dp[i][j] = dp[i-1][j-1]+1
res[index--] = s1[i];
i--;
j--;
}
}
return String.valueOf(res);
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
char[] s1 = in.next().toCharArray();
char[] s2 = in.next().toCharArray();
int[][] dp = getDp(s1, s2);
// System.out.println(dp[s1.length-1][s2.length-1]); //length of lcs
System.out.println(getLCS(s1, s2, dp));
}
}
```
## ä¸ãæé¿å
Œ
±å串
åçï¼ä¹æ¯å¯è½åºç°çã
[详ç»è®²è§£å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/DP/51Nod%20-%201006.%20%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97LCS%20%E5%92%8C%20%E6%9C%80%E9%95%BF%E5%85%AC%E4%BC%97%E5%AD%90%E4%B8%B2.md)ã
```java
/**
* æé¿å
Œ
±å串é®é¢
* é¢ç®: https://www.nowcoder.com/questionTerminal/02e7cc263f8a49e8b1e1dc9c116f7602?toCommentId=1532408
*/
public class M7_LSS {
public int findLongest(String A, int n, String B, int m) {
char[] s1 = A.toCharArray();
char[] s2 = B.toCharArray();
int[][] dp = new int[s1.length][s2.length];
for (int i = 0; i < s1.length; i++) //注æåæé¿å
Œ
±ååºåæç¹ä¸å
dp[i][0] = s1[i] == s2[0] ? 1 : 0;
for (int j = 0; j < s2.length; j++)
dp[0][j] = s1[0] == s2[j] ? 1 : 0;
int res = 0;
for (int i = 1; i < s1.length; i++) {
for (int j = 1; j < s2.length; j++) {
if (s1[i] == s2[j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
res = Math.max(res, dp[i][j]);
}
}
}
return res; //dpæ°ç»ä¸çæå¤§å¼ï¼å°±æ¯æå¤§å
Œ
±å串çé¿åº¦
}
static int[][] getDp(char[] s1, char[] s2) {
int[][] dp = new int[s1.length][s2.length];
for (int i = 0; i < s1.length; i++) //注æåæé¿å
Œ
±ååºåæç¹ä¸å
dp[i][0] = s1[i] == s2[0] ? 1 : 0;
for (int j = 0; j < s2.length; j++)
dp[0][j] = s1[0] == s2[j] ? 1 : 0;
int res = 0;
for (int i = 1; i < s1.length; i++) {
for (int j = 1; j < s2.length; j++) {
if (s1[i] == s2[j]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
res = Math.max(res, dp[i][j]);
}
}
}
System.out.println(res); //4
return dp; //dpæ°ç»ä¸çæå¤§å¼ï¼å°±æ¯æå¤§å
Œ
±å串çé¿åº¦
}
/**
* æ ¹æ®dp表å¾å°çæ¡
*/
static String getLongestSubstring(String s1, String s2, int[][] dp) {
if (s1 == null || s2 == null || s1.length() == 0 || s2.length() == 0)
return "";
int max = 0, end = 0;
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[0].length; j++) {
if (dp[i][j] > max) {
max = dp[i][j];
end = i;
}
}
}
return s1.substring(end - max + 1, end + 1);
}
// 空é´ä¼å
public int findLongest(String A, String B) {
char[] s1 = A.toCharArray();
char[] s2 = B.toCharArray();
int row = 0, col = s2.length - 1; //ä»å³ä¸è§å¼å§
int max = 0, end = 0; //è®°å½æå¤§é¿åº¦åç»æä½ç½®
while (row < s1.length) {
int i = row, j = col;
int ul = 0;
while (i < s1.length && j < s2.length) {
if (s1[i] == s2[j])
ul++;
else
ul = 0;
if (ul > max) {
max = ul;
end = i;
}
i++;
j++;
}
if (col > 0) // è¿æ²¡å°æå·¦è¾¹ -->ãå¾å·¦ç§»å¨
col--;
else
row++; //å°äºæå·¦ --> å¾ä¸ç§»å¨
}
return max;
//return sa.substring(end-max+1, end+1); // [end-max+1, end] è¿åå
Œ
±å串
}
}
```
## å
«ã大æ°å æ³
è¿ä¸ªå¨æ¼å¤å¤çç¬è¯ä¸å°±åºç°è¿ããã
å¯ä»¥ç[è¿ç¯å客](https://www.cnblogs.com/wuqianling/p/5387099.html)å§ï¼æ¯è¾ç®åï¼å°±æ²¡æèªå·±åäºã
```java
public class M8_BigAdd {
//大æ°å æ³
static String add(String str1, String str2){
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
int n1 = s1.length, n2 = s2.length;
int maxL = Math.max(n1, n2);
int[] a = new int[maxL + 1];//注æa,bçæ°ç»å¤§å°é½å¿
é¡»æ¯maxL+1
int[] b = new int[maxL + 1];
for(int i = 0; i < n1; i++) a[i] = s1[n1 - i - 1] - '0';
for(int i = 0; i < n2; i++) b[i] = s2[n2 - i - 1] - '0';
for(int i = 0; i < maxL; i++){
if(a[i] + b[i] >= 10){
int tmp = a[i] + b[i];//注æä¸å®è¦å
æ½ååºæ¥
a[i] = tmp%10;
a[i+1] += tmp/10;
}else
a[i] += b[i];
}
StringBuilder sb = new StringBuilder();
if(a[maxL] != 0) sb.append((char)(a[maxL] + '0'));
for(int i = maxL-1; i >= 0; i--) sb.append((char)(a[i] + '0'));
return sb.toString();
}
}
```
## ä¹ã大æ°ä¹æ³
ä¹ä¸é¾ã
```java
public class M9_BigMul {
// 大æ°ä¹æ³
static String mul(String str1, String str2){
char[] s1 = str1.toCharArray();
char[] s2 = str2.toCharArray();
int n1 = s1.length, n2 = s2.length;
int[] a = new int[n1];
int[] b = new int[n2];
int[] c = new int[n1 + n2];
for(int i = 0; i < n1; i++) a[i] = s1[n1 - i - 1] - '0';
for(int i = 0; i < n2; i++) b[i] = s2[n2 - i - 1] - '0';
for(int i = 0; i < n1; i++){
for(int j = 0; j < n2; j++){
c[i+j] += a[i] * b[j];
}
}
for(int i = 0; i < n1 + n2 - 1; i++){
if(c[i] >= 10){
c[i+1] += c[i]/10;
c[i] %= 10;
}
}
int i;
for(i = n1 + n2 - 1; i >= 0; i--) if(c[i] != 0) break;
StringBuilder sb = new StringBuilder();
for(; i >= 0; i--) sb.append( (char)(c[i] + '0'));
return sb.toString();
}
}
```
## åã大æ°é¶ä¹
è¿ä¸ªç¨å¾®ç¹æ®ä¸ç¹ãæè¿éç®å讲ä¸ä¸ï¼ä¸¾ä¸ªä¾åç»å代ç å°±æäºã
æ¯å¦ç®`50`çé¶ä¹:
* æä»¬è¦å
ä»1å¼å§ä¹ï¼`1*2=2`ï¼å°2åå°`a[0]`ä¸ï¼
* æ¥ä¸æ¥æ¯ç¨`a[0]*3`ï¼`2*3=6`ï¼å°`6`å¨åå¨`a[0]`ä¸ï¼
* æ¥ä¸æ¥æ¯ç¨`a[0]*4`ï¼`6*4=24`ï¼æ¯ä¸¤ä½æ°ï¼é£ä¹`24%10==4`åå°`a[0]`ä¸ï¼`24/10==2`åå°`a[1]`ä¸ï¼
* æ¥ä¸æ¥æ¯ç¨`a[0]*5`ï¼`a[1]*5+num`(妿åä¸ä½ç¸ä¹ç»æä½æ°æ¯ä¸¤ä½æ°ï¼é£ä¹`num`å°±çäºåä½ä¸çé£ä¸ªæ°åï¼å¦ææ¯ä¸ä½æ°ï¼`num==0`)ï¼`24*5=120`ï¼æ¯ä¸ä½æ°ï¼é£ä¹`120%10==0`åå°`a[0]`ä¸ï¼`120/10%10==2`åå°`a[1]`ä¸ï¼`120/100==1`åå°`a[2]`ä¸ï¼
* æ¥ä¸æ¥æ¯ç¨`a[0]*6`ã`a[1]*6+num`ã`a[2]*6+num`ã`120*6=720`ï¼é£ä¹`720%10==0`åå°`a[0]`ä¸ï¼`720/10%10==2`åå°`a[1]`ä¸ï¼`720/100==7`åå°`a[2]`ä¸ããã
代ç ï¼
```java
/**
* é¢ç®é¾æ¥:
* http://nyoj.top/problem/28
*/
public class M10_BigPow {
//大æ°è®¡ç®é¶ä¹ä½æ°ï¼å¯ä»¥èªå·±å¨ç½ä¸æ¾ä¸ä¸å客
//lg(N!)=[lg(N*(N-1)*(N-2)*......*3*2*1)]+1 = [lgN+lg(N-1)+lg(N-2)+......+lg3+lg2+lg1]+1;
static int factorialDigit(int n) {
double sum = 0;
for (int i = 1; i <= n; i++)
sum += Math.log10(i);
return (int) sum + 1;
}
static String bigFactorial(int n) {
int[] res = new int[100001];
int digit = 1;
res[0] = 1;
for (int i = 2; i <= n; i++) {
int carry = 0;
for (int j = 0; j < digit; j++) {
int temp = res[j] * i + carry; //æ¯ä¸ä½çè¿ç®ç»æ
res[j] = temp % 10; //å°æä½ä½ä¿çå¨åä½ç½®
carry = temp / 10; //计ç®è¿ä½, çä¸è¿ä¸ªè¿ä½ä¼ç´¯å å°j+1
}
while (carry != 0) {
res[digit] = carry % 10;
carry /= 10;
digit++;
}
}
StringBuilder sb = new StringBuilder();
for (int i = digit - 1; i >= 0; i--) sb.append( (char)(res[i] + '0'));
return sb.toString();
}
public static void main(String[] args){
System.out.println(bigFactorial(5));
}
}
```
## åä¸ãå
¨æå
æ»å
±æåç§ï¼åä¸¤ç§æ¯åæ±ä½³ç书ä¸çï¼å颿¯ç»å
¸çå`dfs`çãç»åºä¸ä¸ªå客(å两个æèªå·±ç):
* [æä¸¾çæå
¨æå](https://www.cnblogs.com/Kohinur/p/8523856.html)ã
* [éå»éå
¨æå](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/LeetCode/Search/LeetCode%20-%2046.%20Permutations(%E4%B8%89%E7%A7%8D%E6%96%B9%E6%B3%95).md)ã
* [å»éå
¨æå](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/LeetCode/Search/LeetCode%20-%2047.%20Permutations%20II(%E4%B8%8D%E9%87%8D%E5%A4%8D%E5%85%A8%E6%8E%92%E5%88%97)(%E5%9B%9B%E7%A7%8D%E6%96%B9%E5%BC%8F%E5%AE%9E%E7%8E%B0).md)ã
```java
public class M11_Permutation {
static PrintStream out = System.out;
// 1 ~ n çæå
static void permutation(int[] tmp, int cur, int n) {
if (cur == n) { // è¾¹ç
for (int i = 0; i < n; i++)
out.print(tmp[i] + " ");
out.println();
} else for (int i = 1; i <= n; i++) { //å°è¯å¨arr[cur]ä¸å¡«å
åç§æ´æ° (1~n)
boolean flag = true;
for (int j = 0; j < cur; j++)
if (i == tmp[j]) { // 妿iå·²ç»å¨arr[0]~arr[cur-1]ä¸åºç°è¿ï¼åä¸è½é
flag = false;
break;
}
if (flag) {
tmp[cur] = i; //æiå¡«å
å°å½åä½ç½®
permutation(tmp, cur + 1, n);
}
}
}
// æ°ç»çå»éå
¨æå
// tmpåæ¾æåï¼arræ¯åæ°ç»
static void permutation(int[] tmp, int[] arr, int cur, int n) {
if (cur == n) {
for (int i = 0; i < n; i++)
out.print(tmp[i] + " ");
out.println();
} else for (int i = 0; i < n; i++) if (i == 0 || arr[i] != arr[i - 1]) {
int c1 = 0, c2 = 0;
for (int j = 0; j < n; j++)
if (arr[j] == arr[i]) // éå¤å
ç´ ç个æ°
c1++;
for (int j = 0; j < cur; j++)
if (tmp[j] == arr[i]) // åé¢å·²ç»æåçéå¤å
ç´ ç个æ°
c2++;
if (c2 < c1) {
tmp[cur] = arr[i];
permutation(tmp, arr, cur + 1, n);
}
}
}
//éå»éãç»å
¸å
¨æå
static void permutation_2(int[] arr, int cur, int n){
if(cur == n){
for(int i = 0; i < n; i++) out.print(arr[i] + " ");
out.println();
return;
}
for(int i = cur; i < n; i++){
swap(arr, i, cur);
permutation_2(arr, cur + 1, n);
swap(arr, i, cur);
}
}
static void swap(int[] arr, int a, int b){
int t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
// ç¨ä¸ä¸ªusedæ°ç»æ¥æ±å¾å
¨æå
static void dfs(int[] arr, ArrayList list, boolean[] used){
if(list.size() == arr.length){
for(int num : list) out.print(num + " ");
out.println();
return;
}
for(int i = 0; i < arr.length; i++){
// if (used[i] || (i > 0 && !used[i - 1] && arr[i] == arr[i - 1])) continue; // å»éçåæ³ï¼å»éè¦å
æåº Arrays.sort(arr);
if(used[i]) continue;
used[i] = true;
list.add(arr[i]);
dfs(arr, list, used);
list.remove(list.size() - 1);
used[i] = false;
}
}
public static void main(String[] args) {
int n = 5;
permutation(new int[n], 0, n);
out.println("--------------");
int[] arr = {1, 1, 1};
// éè¦å
æåº , ä¸é¢çæååªä¼è¾åº 1,1,1å 为æä»¬å»éäº
Arrays.sort(arr);
permutation(new int[arr.length], arr, 0, arr.length);
out.println("--------------");
permutation_2(new int[]{1, 1}, 0, 2); // è¾åºä¸¤ä¸ª{1, 1}
out.println("---------------");
dfs(new int[]{1, 3, 2}, new ArrayList<>(), new boolean[3]);
}
}
```
è¾åº:
```java
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
--------------
1 1 1
--------------
1 1
1 1
---------------
1 3 2
1 2 3
3 1 2
3 2 1
2 1 3
2 3 1
```
## åäºãåé
è¿ä¸ªæ¨¡æ¿å¨`LeetCode`ä¸é¢ä¹æ¯æåé¢çãä¾å¦[LeetCode - 78. Subsets](https://leetcode-cn.com/problems/subsets/)ã
å
³äºç¬¬ä¸ç§æ¹æ³(äºè¿å¶æä¸¾)ï¼è¿éåç®åè§£é:
 `n = 3`ï¼åè¦æä¸¾`0 - 7` 对åºçæ¯æ`7`个åéï¼æ¯ä¸ªåé廿¾æåªäºå
ç´ `print_subset`ä¸ç `1<< i `ï¼ä¹å°±æ¯å¯¹åºçé£ä¸ªä½ç½®æ¯æå
ç´ çï¼ä¾å¦`1`çäºè¿å¶æ¯`0001`ä¹å°±æ¯ä»£è¡¨`0`ä½ç½®æå
ç´ ï¼`0010`æ¯`2`ï¼ä»£è¡¨ç¬¬ä¸ä¸ªä½ç½®æ¯`1`ï¼`0100`代表第`2`个ä½ç½®ä¸æå
ç´ ï¼ç¸åºç`1000 = 8`对åºç¬¬`3`个ä½ç½®ä¸æå
ç´ ã æ»ç»æ¥è¯´ä¹å°±æ¯å¯¹åº`1<< i`对åº` i`䏿¯`1`(ä»`0`å¼å§)ï¼å
¶ä½ä½ç½®æ¯`0`ãçå¾å®¹æçè§£ï¼

代ç :
```java
import java.io.PrintStream;
public class M12_Subset {
static PrintStream out = System.out;
//æå°0~n-1çææåé
//æç
§éå¢é¡ºåºå°±è¡æé åé 鲿¢åéçéå¤
static void print_subset(int[] arr, int cur, int n){
for(int i = 0; i < cur; i++)
out.print(arr[i] + " ");
out.println();
int s = cur != 0 ? arr[cur-1] + 1 : 0; //ç¡®å®å½åå
ç´ çæå°å¯è½å¼
for(int i = s; i < n; i++){
arr[cur] = i;
print_subset(arr, cur+1, n);
}
}
// 1~n çææåéï¼ä½åéæ³
static void print_subset(int cur, boolean[] bits, int n) {
if (cur == n+1) {
for (int i = 1; i < cur; i++)
if (bits[i])
out.print(i + " ");
out.println();
return;
}
bits[cur] = true;
print_subset(cur + 1, bits, n);
bits[cur] = false;
print_subset(cur + 1, bits, n);
}
// 0 ~ n-1çææåéï¼äºè¿å¶æ³æä¸¾0 ~ n-1çææåé
static void print_subset(int n){
for(int mask = 0; mask < (1 << n); mask++){
for(int i = 0; i < n; i++)
if( ((mask >> i) & 1) == 1) //åä¸é¢ä¸æ ·
// if( ((1 << i) & mask) != 0)
out.print(i + " ");
out.println();
}
}
public static void main(String[] args){
int n = 3;
// 0~n-1çåé
print_subset(new int[n], 0, n);
out.println("---------------");
// 1 ~ n çåé
print_subset(1, new boolean[n+1], n);
out.println("---------------");
// 1~nçåé
print_subset(n);
}
}
```
è¾åº:
```java
0
0 1
0 1 2
0 2
1
1 2
2
---------------
1 2 3
1 2
1 3
1
2 3
2
3
---------------
0
1
0 1
2
0 2
1 2
0 1 2
```
ç»åº`LeetCode-78`ç代ç ï¼
```java
import java.util.*;
class Solution {
private boolean[] bit;
private List> res;
public List> subsets(int[] nums) {
res = new ArrayList<>();
bit = new boolean[nums.length];
dfs(0, nums);
return res;
}
//ç¨ä¸ä¸ªbitæ°ç»è®°å½
private void dfs(int cur, int[] arr) {
if (cur == arr.length) {
List tmp = new ArrayList<>();
for (int i = 0; i < cur; i++) if (bit[i]) tmp.add(arr[i]);
res.add(new ArrayList<>(tmp));
return;
}
bit[cur] = true;
dfs(cur + 1, arr);
bit[cur] = false;
dfs(cur + 1, arr);
}
public static void main(String[] args){
System.out.println(new Solution().subsets(new int[]{1, 2, 3}));
}
}
```
第äºç§ä½¿ç¨äºè¿å¶æä¸¾:
```java
class Solution {
public List> subsets(int[] nums) {
List> res = new ArrayList<>();
for(int mask = 0; mask < (1 << nums.length); mask++){
List tmp = new ArrayList<>();
for(int i = 0; i < nums.length; i++) if( ( (mask >> i) & 1) == 1) tmp.add(nums[i]);
res.add(tmp);
}
return res;
}
}
```
## åä¸ãNçå
Nçåé®é¢ä¹æ¯ç»å
¸çåæº¯é®é¢ã[详ç»è§£éå客](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/LeetCode/Search/LeetCode%20-%2051.%20N-Queens(N%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98).md)ã
```java
public class M13_NQueue {
static PrintStream out = System.out;
static int count;
// 第ä¸ç§è§£æ³
static void dfs(int r, int n, int[] cols) { // å½åæ¯rè¡
if (r == n) {
count++;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (cols[i] == j)
out.print("0 ");
else
out.print(". ");
}
out.println();
}
out.println("-------------------");
return;
}
for (int c = 0; c < n; c++) { // èå¯çæ¯æ¯ä¸å
cols[r] = c; // å°è¯å° rè¡ççåæ¾å¨ç¬¬cå
boolean ok = true;
for (int i = 0; i < r; i++) { //æ£æ¥æ¯å¦åå·²ç»æ¾ç½®çå²çª
//æ£æ¥å,"å¯å¯¹è§çº¿","主对è§çº¿"
if (cols[r] == cols[i] || r - i == cols[r] - cols[i] || r - i == cols[i] - cols[r]) {
ok = false;
break;
}
}
if (ok) dfs(r + 1, n, cols);
}
}
// 第äºç§è§£æ³: 使ç¨csä¸ä¸ªæ°ç»è®°å½ï¼è¿éåªæ¯ç»è®¡æ°ç®ï¼æ²¡æä¿çè§£
static void dfs(int r, boolean[] cs, boolean[] d1, boolean[] d2, int n) { // å½åæ¯rè¡
if (r == n) {
count++;
return;
}
for (int c = 0; c < n; c++) { //èå¯çæ¯æ¯ä¸å
int id1 = r + c; //主对è§çº¿
int id2 = r - c + n - 1; // å¯å¯¹è§çº¿
if (cs[c] || d1[id1] || d2[id2]) continue;
cs[c] = d1[id1] = d2[id2] = true;
dfs(r + 1, cs, d1, d2, n);
cs[c] = d1[id1] = d2[id2] = false;
}
}
// 第äºç§è§£æ³çå级: ä¸ä¸ä¸ªçæ¬çå级ï¼ä½¿ç¨colsæ°ç» ä¿çè§£
static void dfs(int r, boolean[][] vis, int[] cols, int n) { //éè¡æ¾ç½®çå
if (r == n) {
count++;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (cols[i] == j)
out.print("0 ");
else
out.print(". ");
}
out.println();
}
out.println("--------------");
return;
}
for (int c = 0; c < n; c++) { //å°è¯å¨ curè¡ç å å æ¾ç½®çå
if (vis[0][c] || vis[1][r + c] || vis[2][r - c + n - 1]) continue;//夿å½åå°è¯ççåçåã主对è§çº¿
vis[0][c] = vis[1][r + c] = vis[2][r - c + n - 1] = true;
cols[r] = c; //rè¡ç忝 c
dfs(r + 1, vis, cols, n);
vis[0][c] = vis[1][r + c] = vis[2][r - c + n - 1] = false;//åè®°ï¼ä¸å®è¦æ¹åæ¥
}
}
public static void main(String[] args) {
int n = 8; // 8çå
count = 0;
dfs(0, n, new int[n]); // 8çå
out.println(count);
out.println("=====================");
count = 0;
dfs(0, new boolean[n], new boolean[2 * n - 1], new boolean[2 * n - 1], n);
out.println(count);
out.println("=====================");
count = 0;
dfs(0, new boolean[3][2*n-1], new int[n], n);
out.println(count);
}
}
```
## ååãå¹¶æ¥é
å¹¶æ¥éç®åå好ç¨ï¼å
·ä½ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Data%20Structure/UnionFind/POJ%20-%201611.%20The%20Suspects%E4%BB%A5%E5%8F%8A%E5%B9%B6%E6%9F%A5%E9%9B%86%E6%80%BB%E7%BB%93.md)ã
```java
import java.io.*;
import java.util.Scanner;
/**
* åºäºrankçå¹¶æ¥é
* é¢ç®é¾æ¥ï¼http://poj.org/problem?id=1611
* é¢ç®å¤§æ : ç
æ¯ä¼ æï¼å¯ä»¥éè¿ä¸äºç¤¾å¢æ¥è§¦ç»åºä¸äºç¤¾å¢(0å·äººç©æ¯è¢«ææç)鮿å¤å°äºº(0~n-1个人)被ææ
*/
public class M14_UnionFind_1 {
static int[] f;
static int[] rank;
static int findRoot(int p) {
while (p != f[p]) {
f[p] = f[f[p]];
p = f[p];
}
return p;
}
static void union(int a, int b) {
int aR = findRoot(a);
int bR = findRoot(b);
if (aR == bR) return;
if (rank[aR] < rank[bR]) {
f[aR] = f[bR];
} else if (rank[aR] > rank[bR]) {
f[bR] = f[aR];
} else {
f[aR] = f[bR];
rank[bR]++;
}
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
PrintStream out = System.out;
while (in.hasNext()) {
int n = in.nextInt();
int m = in.nextInt();
if(n == 0 && m == 0) break;
f = new int[n];
rank = new int[n];
for(int i = 0; i < n; i++) {
f[i] = i;
rank[i] = 1;
}
for(int i = 0; i < m; i++){
int c = in.nextInt();
int root = in.nextInt();
for(int j = 0; j < c - 1; j++) {
int num = in.nextInt();
union(root, num);
}
}
int res = 1; // 0å·²ç»ææ
for(int i = 1; i < n; i++)
if(findRoot(0) == findRoot(i)) res++;
out.println(res);
}
}
}
```
第äºç§åºäºsizeç
```java
import java.io.*;
import java.util.Scanner;
/**
* åºäºsizeçå¹¶æ¥é
* é¢ç®é¾æ¥ï¼http://poj.org/problem?id=1611
* é¢ç®å¤§æ : ç
æ¯ä¼ æï¼å¯ä»¥éè¿ä¸äºç¤¾å¢æ¥è§¦ç»åºä¸äºç¤¾å¢(0å·äººç©æ¯è¢«ææç)鮿å¤å°äºº(0~n-1个人)被ææ
*/
public class M14_UnionFind_2 {
static int[] f;
static int[] sz; // size
static int findRoot(int p) {
while (p != f[p]) {
f[p] = f[f[p]];
p = f[p];
}
return p;
}
// å°å
ç´ ä¸ªæ°å°çéååå¹¶å°å
ç´ ä¸ªæ°å¤çéåä¸
static void union(int a, int b) {
int aR = findRoot(a);
int bR = findRoot(b);
if (aR == bR) return;
if (sz[aR] < sz[bR]) {
f[aR] = f[bR];
sz[bR] += sz[aR]; // æ´æ°éåå
ç´ ä¸ªæ°
}else{
f[bR] = f[aR];
sz[aR] += sz[bR];
}
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
PrintStream out = System.out;
while (in.hasNext()) {
int n = in.nextInt();
int m = in.nextInt();
if(n == 0 && m == 0) break;
f = new int[n];
sz = new int[n];
for(int i = 0; i < n; i++) {
f[i] = i;
sz[i] = 1;
}
for(int i = 0; i < m; i++){
int c = in.nextInt();
int root = in.nextInt();
for(int j = 0; j < c - 1; j++) {
int num = in.nextInt();
union(root, num);
}
}
int res = 1; // 0å·²ç»ææ
for(int i = 1; i < n; i++) if(findRoot(0) == findRoot(i)) res++;
out.println(res);
}
}
}
```
## åäºãæ ç¶æ°ç»
æ ç¶æ°ç»ï¼æå¥½çè§£éå°±æ¯ç[è¿ä¸ªç½ç«](https://visualgo.net/en/fenwicktree?slide=1)çå¨å¾ã
```java
public class M15_FenWick {
// åé¢: https://leetcode.com/problems/range-sum-query-mutable/
class NumArray {
private int[] sums;// æ ç¶æ°ç»ä¸æ±åçæ°ç»
private int[] data;//çå®åæ¾æ°æ®çæ°ç»
private int n;
private int lowbit(int x) {return x & (-x);}
private int query(int i){
int s = 0;
while(i > 0){//æ ç¶æ°ç»ä¸ç´¢å¼æ¯1~n
s += sums[i];
i -= lowbit(i);
}
return s;
}
// fenWick update
private void renewal(int i, int delta){// deltaæ¯å¢éï¼ä¸æ¯æ°å¼
while(i <= n){//æ ç¶æ°ç»ä¸ç´¢å¼æ¯1~n
sums[i] += delta;
i += lowbit(i);
}
}
public NumArray(int[] nums) {
n = nums.length;
sums = new int[n+1];
data = new int[n];
for(int i = 0; i < n; i++) {
data[i] = nums[i];
renewal(i+1, nums[i]);
}
}
public void update(int i, int val) {
renewal(i+1, val - data[i]);
data[i] = val;
}
public int sumRange(int i, int j) {
return query(j+1) - query(i);
}
}
public static void main(String[] args){
}
}
```
## åå
ã线段æ
线段æ åºç°çå°ï¼å¯ä»¥éæ©æ§çå¦ä¹ ãå
·ä½å¯ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Data%20Structure/SegmentTree/%E7%BA%BF%E6%AE%B5%E6%A0%91%E6%80%BB%E7%BB%93%E4%BB%A5%E5%8F%8ALeetCode%20-%20307.%20Range%20Sum%20Query%20-%20Mutable.md)ã
```java
public class M16_SegmentTree_1 {
// åé¢(åæ ç¶æ°ç»åºèªåä¸ä¸ª): https://leetcode.com/problems/range-sum-query-mutable/
class NumArray {
class SegTree {
int[] tree;
int[] data;
public SegTree(int[] arr) {
data = new int[arr.length];
for (int i = 0; i < arr.length; i++) data[i] = arr[i];
tree = new int[4 * arr.length]; //æå¤éè¦4 * n
buildTree(0, 0, arr.length - 1);
}
public void buildTree(int treeIndex, int start, int end) {
if (start == end) {
tree[treeIndex] = data[start];
return;
}
int treeLid = treeIndex * 2 + 1;
int treeRid = treeIndex * 2 + 2;
int m = start + (end - start) / 2;
buildTree(treeLid, start, m);
buildTree(treeRid, m + 1, end);
tree[treeIndex] = tree[treeLid] + tree[treeRid]; //åºé´æ±å
}
public int query(int qL, int qR) {
if (qL < 0 || qL >= data.length || qR < 0 || qR >= data.length || qL > qR) return -1;
return query(0, 0, data.length - 1, qL, qR);
}
private int query(int treeIndex, int start, int end, int qL, int qR) {
if (start == qL && end == qR) {
return tree[treeIndex];
}
int mid = start + (end - start) / 2;
int treeLid = treeIndex * 2 + 1;
int treeRid = treeIndex * 2 + 2;
if (qR <= mid) { //åå³åºé´æ²¡å
³ç³» ,ç´æ¥å»å·¦è¾¹æ¥æ¾ [0,4] qR <= 2 [0,2]ä¹é´æ¥æ¾
return query(treeLid, start, mid, qL, qR);
} else if (qL > mid) {//åå·¦åºé´æ²¡æå
³ç³»ï¼ç´æ¥å»å³è¾¹æ¥æ¾ [0,4] qL > 2 --> [3,4]
return query(treeRid, mid + 1, end, qL, qR);
} else { //å¨ä¸¤è¾¹é½æï¼æ¥è¯¢çç»æ åå¹¶
return query(treeLid, start, mid, qL, mid) + //æ³¨ææ¯æ¥è¯¢ [qL,m]
query(treeRid, mid + 1, end, mid + 1, qR); //æ¥è¯¢[m+1,qR]
}
}
public void update(int index, int val) {
data[index] = val; //é¦å
ä¿®æ¹data
update(0, 0, data.length - 1, index, val);
}
private void update(int treeIndex, int start, int end, int index, int val) {
if (start == end) {
tree[treeIndex] = val; // æåæ´æ°
return;
}
int m = start + (end - start) / 2;
int treeLid = 2 * treeIndex + 1;
int treeRid = 2 * treeIndex + 2;
if (index <= m) { //左边
update(treeLid, start, m, index, val);
} else {
update(treeRid, m + 1, end, index, val);
}
tree[treeIndex] = tree[treeLid] + tree[treeRid]; //æ´æ°å®å·¦å³åæ ä¹åï¼èªå·±åå°å½±åï¼éæ°æ´æ°å
}
}
private SegTree segTree;
public NumArray(int[] nums) {
if (nums == null || nums.length == 0) return;
segTree = new SegTree(nums);
}
public void update(int i, int val) {
segTree.update(i, val);
}
public int sumRange(int i, int j) {
return segTree.query(i, j);
}
}
}
```
第äºç§åæ³ï¼åºäºæ çå¼ç¨:
```java
public class M16_SegmentTree_2 {
// 线段æ 第äºç§åæ³
// é¢ç®: https://leetcode.com/problems/range-sum-query-mutable/
class SegNode{
int start; // 表示çåºé´ç左端ç¹
int end; // 表示åºé´çå³ç«¯ç¹ , å½start == endçæ¶åå°±åªæä¸ä¸ªå
ç´
int sum;
SegNode left;
SegNode right;
public SegNode(int start, int end, int sum, SegNode left, SegNode right) {
this.start = start;
this.end = end;
this.sum = sum;
this.left = left;
this.right = right;
}
}
class NumArray {
SegNode root;
int[] arr;
private SegNode buildTree(int s, int e){
if(s == e)
return new SegNode(s, e, arr[s], null, null);
int mid = s + (e - s) / 2;
SegNode L = buildTree(s, mid);
SegNode R = buildTree(mid+1, e);
return new SegNode(s, e, L.sum + R.sum, L, R);
}
private void update(SegNode node, int i, int val){
if(node.start == node.end && node.start == i){
node.sum = val;
return;
}
int mid = node.start + (node.end - node.start) / 2;
if(i <= mid)
update(node.left, i, val);
else
update(node.right, i, val);
node.sum = node.left.sum + node.right.sum; // è®°å¾ä¸é¢çæ´æ°å®ä¹åï¼æ´æ°å½åçå
}
private int query(SegNode node, int i, int j){
if(node.start == i && node.end == j)
return node.sum;
int mid = node.start + (node.end - node.start) / 2;
if(j <= mid){ // åºé´å®å
¨å¨å·¦è¾¹
return query(node.left, i, j);
}else if(i > mid) { // åºé´å®å
¨å¨å³è¾¹
return query(node.right, i, j);
}else {
return query(node.left, i, mid) + query(node.right, mid+1, j);
}
}
public NumArray(int[] nums) {
arr = new int[nums.length];
for(int i = 0; i < nums.length; i++) arr[i] = nums[i];
if(nums.length != 0)
root = buildTree(0, nums.length-1);
}
public void update(int i, int val) {
arr[i] = val;
update(root, i, val);
}
public int sumRange(int i, int j) {
return query(root, i, j);
}
}
}
```
## åä¸ãåå
¸æ
å
·ä½ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Data%20Structure/Trie/LeetCode%20-%20208.%20Implement%20Trie%20(Prefix%20Tree)%E4%BB%A5%E5%8F%8A%E5%AE%9E%E7%8E%B0%E5%AD%97%E5%85%B8%E6%A0%91(%E5%89%8D%E7%BC%80%E6%A0%91).md)ã
ä¸é¢æµè¯çä¾å:
æ 䏿`"abc","ab","ab","abd","bc","bd","cd","cde","ce"`æ»å
±9个å符串ãå¦ä¸çç»æ:

代ç :
```java
public class M17_Trie {
// Trie
static class Trie {
private class Node {
int path;
int end;
Node[] next;//ä½¿ç¨æ´æ°è¡¨ç¤ºå符ãc - 'a'
public Node() {
path = 0;
end = 0;
next = new Node[26];
}
}
private Node root;
public Trie() {
root = new Node();
}
//æå
¥ä¸ä¸ªå符串
public void insert(String word) {
if (word == null)
return;
Node cur = root;
int index = 0;
for (int i = 0; i < word.length(); i++) {
index = word.charAt(i) - 'a';
if (cur.next[index] == null) { //没æå°±æ°å»º
cur.next[index] = new Node();
}
cur = cur.next[index];
cur.path++; //ç»è¿è¿é
}
cur.end++;
}
//ç»è®¡æä¸ªåç¬¦ä¸²çæ°é
public int count(String word) {
if (word == null)
return 0;
Node cur = root;
int index = 0;
for (int i = 0; i < word.length(); i++) {
index = word.charAt(i) - 'a';
if (cur.next[index] == null)
return 0;
cur = cur.next[index];
}
return cur.end;
}
public boolean search(String word) {
return count(word) > 0;
}
// æ±åç¼æ¯prefixçæ°é
public int prefixNum(String prefix) {
if (prefix == null)
return 0;
Node cur = root;
int index = 0;
for (int i = 0; i < prefix.length(); i++) {
index = prefix.charAt(i) - 'a';
if (cur.next[index] == null)
return 0;
cur = cur.next[index];
}
return cur.path; //è¿åè¿ä¸ªç»è¿çããä¹å°±æ¯ä»¥è¿ä¸ªä¸ºå驱ç
}
public boolean startsWith(String prefix) {
return prefixNum(prefix) > 0;
}
// å¨trieä¸å é¤word
public void remove(String word) {
if (word == null)
return;
if (!search(word)) //ä¸å
å«è¿ä¸ªå符串
return;
Node cur = root;
int index = 0;
for (int i = 0; i < word.length(); i++) {
index = word.charAt(i) - 'a';
if (--cur.next[index].path == 0) {
cur.next[index] = null; //éæ¾æä¸é¢çè¿æ£µæ
return;
}
cur = cur.next[index];
}
cur.end--; //æåè¿ä¸ªå符串ä¹è¦--
}
}
public static void main(String[] args) {
// ç®åæµè¯
Trie trie = new Trie();
trie.insert("abc");
trie.insert("ab");
trie.insert("ab");
trie.insert("abd");
trie.insert("bc");
trie.insert("bd");
trie.insert("cd");
trie.insert("cde");
trie.insert("ce");
System.out.println(trie.count("ab"));
trie.remove("ab");
System.out.println(trie.count("ab"));
System.out.println(trie.count("abd"));
trie.remove("ab");
System.out.println(trie.count("ab"));
System.out.println(trie.count("abd"));
trie.remove("abd");
System.out.println(trie.count("abd"));
}
}
```
## åå
«ãåè°æ
è§£å³çæ¯: **å¿«é寻æ¾ä¸ä¸ªæ°ç»ä¸æ¯ä¸ä¸ªå
ç´ ãå·¦å³ä¸¤è¾¹ç¦»å®`arr[i]`æè¿çæ¯å®å¤§/å°çæ°**ã
å
·ä½ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Data%20Structure/MonotoneStack/%E5%8D%95%E8%B0%83%E6%A0%88%E4%BB%8B%E7%BB%8D%E4%BB%A5%E5%8F%8A%E6%9E%84%E9%80%A0%E6%95%B0%E7%BB%84%E7%9A%84MaxTree%E9%97%AE%E9%A2%98.md)ã
æµè¯ä¸çä¾å:

代ç ï¼
```java
import java.io.PrintStream;
import java.util.Stack;
/**
* åè°æ : 寻æ¾ä¸ä¸ªæ°ç»ä¸æ¯ä¸ä¸ªå
ç´ ãå·¦å³ä¸¤è¾¹ç¦»å®arr[i]æè¿çæ¯å®å¤§çæ°
* æ åºå°æ é¡¶: ç±å¤§å°å° (ä¹å¯ä»¥èªå®ä¹ä»å°å°å¤§)
*/
public class M18_MonotoneStack {
static PrintStream out = System.out;
public static void main(String[] args) {
int[] arr = {3, 4, 5, 1, 2};
int n = arr.length;
/**--------------æ¾å·¦è¾¹ç第ä¸ä¸ªæ¯arr[i]大ç-------------------*/
int[] LL = new int[n]; //LL[i]åçæ¯å·¦è¾¹ç¬¬ä¸ä¸ªæ¯arr[i]å¤§çæ°ç䏿
Stack stack = new Stack<>();
for(int i = 0; i < n; i++){
while(!stack.isEmpty() && arr[i] > arr[stack.peek()]){
int top = stack.pop();
if(stack.isEmpty()){
LL[top] = -1; //å·¦è¾¹æ²¡ææ¯arr[i]å¤§çæ°
}else {
LL[top] = stack.peek();
}
}
stack.push(i); //æ³¨ææ¯ä¸æ å
¥æ
}
// 妿æ ä¸ç©º //å¤çå©ä¸ç
while(!stack.isEmpty()){
int top = stack.pop();
if(stack.isEmpty()) LL[top] = -1;
else LL[top] = stack.peek();
}
for(int i = 0; i < n; i++) out.print(LL[i] + " "); // -1 -1 -1 2 2
out.println();
/**--------------æ¾å³è¾¹ç第ä¸ä¸ªæ¯arr[i]大ç-------------------*/
int[] RR = new int[n];//RR[i]åçæ¯å³è¾¹è¾¹ç¬¬ä¸ä¸ªæ¯arr[i]å¤§çæ°ç䏿
stack = new Stack<>();
// åè¿æ¥å³å¯
for(int i = n-1; i >= 0; i--){
while(!stack.isEmpty() && arr[i] > arr[stack.peek()]){
int top = stack.pop();
if(stack.isEmpty()){
RR[top] = -1; //å·¦è¾¹æ²¡ææ¯arr[i]å¤§çæ°
}else {
RR[top] = stack.peek();
}
}
stack.push(i); //æ³¨ææ¯ä¸æ å
¥æ
}
// 妿æ ä¸ç©º, å¤çå©ä¸ç
while(!stack.isEmpty()){
int top = stack.pop();
if(stack.isEmpty()) RR[top] = -1;
else RR[top] = stack.peek();
}
for(int i = 0; i < n; i++) out.print(RR[i] + " "); // è¾åº 1 2 -1 4 -1
out.println();
}
}
```
## åä¹ãåè°éå
è§£å³çé®é¢: **ç¨æ¥æ±åºå¨æ°ç»çæä¸ªåºé´èå´å
æ±åºæå¤§å¼**ã
æç»å
¸çå°±æ¯æ»å¨çªå£é®é¢ã[详ç»è§£éå客](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/Other/LintCode/TwoPointer/LintCode%20-%20362.%20Sliding%20Window%20Maximum%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E7%9A%84%E6%9C%80%E5%A4%A7%E5%80%BC.md)ã
```java
import java.io.PrintStream;
import java.util.*;
/**
* åè°éå: ç¨æ¥æ±åºå¨æ°ç»çæä¸ªåºé´èå´å
æ±åºæå¤§å¼
* æç»å
¸çé®é¢: æ»å¨çªå£çæå¤§å¼:
* é¢ç®é¾æ¥: https://www.lintcode.com/problem/sliding-window-maximum/description
*/
public class M19_MonotoneQueue {
static PrintStream out = System.out;
//åè°ååéå(çªå£å
æå¤§å¼), æä¸æ¶å»çªå£å
çæå¤§å¼æ¯å¯¹å¤´ arr[queue.peekFirst()]
public ArrayList maxSlidingWindow(int[] nums, int k) {
if (nums == null || k < 1 || nums.length < k)
return null;
ArrayList res = new ArrayList<>();
LinkedList queue = new LinkedList<>();//ä¿åçæ¯ä¸æ
for (int i = 0; i < nums.length; i++) {
while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]) //è¦é尾满足æ¡ä»¶
queue.pollLast();
queue.addLast(i); // æ³¨ææ·»å çæ¯ä¸æ
if (i - k == queue.peekFirst())
queue.pollFirst();//å左弹åºè¿æçæ°æ®
if (i >= k - 1) // è¾¾å°äºk个æ°ï¼è¿ä¸ªçªå£å
çæå¤§å¼æ¯éåç头é¨
res.add(nums[queue.peekFirst()]);
}
return res;
}
public static void main(String[] args) {
int[] arr = {1, 2, 7, 7, 8};
out.println(new M19_MonotoneQueue().maxSlidingWindow(arr, 3)); // 7, 7, 8
}
}
```
## äºåãKMP
ç»åºä¸¤ä¸ªå客:
* [æå®¢å¦é¢-KMPç®æ³](http://wiki.jikexueyuan.com/project/kmp-algorithm/define.html)ã
* [Hdu - 1711. KMPæ»ç»](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/String/KMP/Hdu%20-%201711.%20Number%20Sequence%E4%BB%A5%E5%8F%8AKMP%E7%AE%97%E6%B3%95%E6%80%BB%E7%BB%93.md)ã
```java
import java.util.*;
import java.io.*;
/**
* KMP: 模å¼ä¸²å¹é
é®é¢
* é¢ç®: http://acm.hdu.edu.cn/showproblem.php?pid=1711
*/
public class M20_KMP {
static int kmp(int[] s, int[] p) {
if (s == null || p == null || s.length < p.length || p.length == 0)
return -1;
int[] next = getNext(p);
int i1 = 0, i2 = 0;
while (i1 < s.length && i2 < p.length) {
if (s[i1] == p[i2]) {
i1++;
i2++;
} else {
if (next[i2] == -1) {
i1++;
} else {
i2 = next[i2];
}
}
}
return i2 == p.length ? i1 - i2 : -1; // è¿åi2å¨i1å¹é
å°ç第ä¸ä¸ªä½ç½®
}
/**
* nextæ°ç»å«ä¹:
* next[i]çå«ä¹æ¯å¨str[i]ä¹åçå符串ä¹å°±æ¯: str[0...i)ä¸ï¼
* å¿
须以str[i-1]ç»å°¾çåç¼å串(ä¸è½å
å«str[0]) å
* å¿
须以str[0]å¼å¤´çåç¼å串(ä¸è½å
å«str[i-1])çæå¤§å¹é
é¿åº¦
*/
static int[] getNext(int[] arr) {
if (arr.length == 1) return new int[]{-1};
int[] next = new int[arr.length + 1];
next[0] = -1;
next[1] = 0;
int cn = 0;
for (int i = 2; i <= arr.length; ) {
if (arr[i - 1] == arr[cn]) {
next[i++] = ++cn;
} else {
if (cn > 0) {
cn = next[cn];
} else {
next[i++] = 0;
}
}
}
return next;
}
public static void main(String[] args) {
// System.out.println(Arrays.toString(getNext(new int[]{1, 2, 3, 1, 2})));
Scanner cin = new Scanner(new BufferedInputStream(System.in));
int k = cin.nextInt();
while (k-- > 0) {
int n = cin.nextInt();
int m = cin.nextInt();
int[] s = new int[n];
int[] p = new int[m]; //åè®°ä¸è½é便new int[n+1]å 为åé¢ç¨length代æ¿äºn
for (int i = 0; i < n; i++) s[i] = cin.nextInt();
for (int i = 0; i < m; i++) p[i] = cin.nextInt();
int res = kmp(s, p);
System.out.println(res == -1 ? -1 : res + 1);
}
}
}
```
## äºåä¸ãManacherç®æ³
è§£å³çæ¯æ±æé¿åæå串çé®é¢ã
å
·ä½ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E5%88%B7%E9%A2%98/LeetCode/String/Manacher/LeetCode%20-%205.%20Longest%20Palindromic%20Substring(%E4%B8%89%E7%A7%8D%E8%A7%A3%E6%B3%95%E5%8F%8AManacher%E7%AE%97%E6%B3%95%E8%AF%A6%E8%A7%A3).md)ã
```java
import java.util.*;
import java.io.*;
/**
* 马æè½¦ç®æ³: è§£å³O(N)æ±æé¿åæä¸²é®é¢
* é¢ç®ï¼http://acm.hdu.edu.cn/showproblem.php?pid=3068
*
* 夿³¨: å¦æè¦æ±åºæé¿åæï¼å°±è®°å½ä¸ä¸å徿é¿åæçæ¶åæé¿åå¾çä½ç½®å³å¯
*/
public class M21_Manacher {
/**
* è·åæå®æ ¼å¼çå符串(ä¸é´å两边é½å¸¦æ#) è¿æ ·å¯ä»¥å¤çå¶åæ
* ä¾å¦ : 妿æ¯abc -->#a#b#c#
* 妿æ¯abcd -->#a#b#c#d#
*/
static char[] manacherString(String str) {
char[] res = new char[str.length() * 2 + 1];
int index = 0;
for (int i = 0; i < res.length; i++)
res[i] = ((i & 1) == 0) ? '#' : str.charAt(index++);
return res;
}
static int manacher(String s) {
if (s == null || s.length() == 0) return 0;
char[] chs = manacherString(s);
int[] r = new int[chs.length]; //è®°å½æ¯ä¸ªä½ç½®çæé¿åæåå¾,æ³¨ææ¯chsçé¿åº¦
int R = -1, C = -1; //åå«ä»£è¡¨ç®åçæé¿åæå³è¾¹çï¼åå®çä¸å¿
int max = Integer.MIN_VALUE; //è®°å½ç»æ
for (int i = 0; i < chs.length; i++) {
r[i] = R > i ? Math.min(r[2 * C - i], R - i) : 1; //è¿å¥ä»£ç å
å«ä¸ç§æ
åµ ç¬¬ä¸ç§å¤§æ
åµ,åäºç§ä¸ç(1)(2)æ
åµ
while (i + r[i] < chs.length && i - r[i] >= 0) { //ä¸è¶ç //注æè¿å
æ¬äºåç§æ
åµï¼é½è¦æ©ä¸ä¸ï¼ä¸ºäºèç代ç
if (chs[i + r[i]] == chs[i - r[i]]) { // å¾å颿©ä¸ä¸
r[i]++;
} else { //æ©ä¸å¨äº
break;
}
}
if (i + r[i] > R) { //æ´æ°æå³è¾¹çåå®çä¸å¿
R = i + r[i];
C = i;
}
max = Math.max(max, r[i]); //åæå¤§çr[i] (r[i]è®°å½çæ¯æ¯ä¸ªä½ç½®çæé¿åæåå¾)
}
return max - 1; //æ±åºæ¥çæ¯å äº'#'ç
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
while (in.hasNext()) {
String s = in.next();
System.out.println(manacher(s));
}
}
}
```
## äºåäºãæææåº
å
·ä½å¯ä»¥ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Graph/%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F/Uva%20-%2010305.%20Ordering%20Tasks%20_%20LeetCode%20-%20207.%20Course%20Schedule%20(%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F).md)ã
```java
import java.io.*;
import java.util.*;
/**
* BFSæææåº
* é¢ç®: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1246
*/
public class M22_TopologySort_1 {
static ArrayList G[];
static int[] in;
static int n, m;
static PrintStream out;
static void topologySort() {
Queue queue = new LinkedList<>();
for (int i = 1; i <= n; i++) if (in[i] == 0) queue.add(i);
boolean flag = true; // for output
while (!queue.isEmpty()) {
int cur = queue.poll();
if (flag) {
out.print(cur);
flag = false;
} else
out.print(" " + cur);
for (int i = 0; i < G[cur].size(); i++) {
int to = G[cur].get(i);
if (--in[to] == 0)
queue.add(to);
}
}
out.println();
}
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
out = System.out;
while (sc.hasNext()) {
n = sc.nextInt();
m = sc.nextInt();
if (n == 0 && m == 0)
break;
in = new int[n + 1];
G = new ArrayList[n + 1];
for (int i = 0; i <= n; i++)
G[i] = new ArrayList<>();
for (int i = 0; i < m; i++) {
int from = sc.nextInt();
int to = sc.nextInt();
G[from].add(to);
in[to]++;
}
topologySort();
}
}
}
```
第äºç§å©ç¨dfsè®°å½ä¸ä¸ªç¶æ:
```java
import java.io.*;
import java.util.*;
/**
* DFSæææåº
* é¢ç®: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1246
*/
public class M22_TopologySort_2 {
static ArrayList G[];
static int[] vis;
static int n, m;
static int[] res;
static int p;
static boolean dfs(int cur) {
vis[cur] = 2; // now is visiting
for (int to : G[cur]) {
if (vis[to] == 2 || (vis[to] == 0 && !dfs(to))) // exist directed cycle
return false;
}
vis[cur] = 1; // now is visited
res[p--] = cur;
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
PrintWriter out = new PrintWriter(System.out);
while (sc.hasNext()) {
n = sc.nextInt();
m = sc.nextInt();
if (n == 0 && m == 0)
break;
G = new ArrayList[n + 1];
vis = new int[n + 1];
for (int i = 0; i <= n; i++)
G[i] = new ArrayList<>();
for (int i = 0; i < m; i++) {
int from = sc.nextInt();
int to = sc.nextInt();
G[from].add(to);
}
p = n - 1; // back to front
res = new int[n + 1];
boolean ok = true;
for (int i = 1; i <= n; i++) {
if (vis[i] == 0)
dfs(i);
}
for (int i = 0; i < n - 1; i++)
out.print(res[i] + " ");
out.println(res[n - 1]);
out.flush();
}
out.close();
}
}
```
## äºåä¸ãæå°çææ
两ç§ç®æ³ï¼`Kruskal`å`Prim`ãå
·ä½ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Graph/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91/Hdu%20-%201863.%20%E7%95%85%E9%80%9A%E5%B7%A5%E7%A8%8B(%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91%E6%A8%A1%E6%9D%BF%E9%A2%98)(Kruskal%E7%AE%97%E6%B3%95%E5%92%8CPrim%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0).md)ã
```java
import java.util.*;
import java.io.*;
/**
* æå°çææ Kruskal
* é¢ç®: http://acm.hdu.edu.cn/showproblem.php?pid=1863
*/
public class M23_MST_Kruskal {
static int n;
static int m;
static ArrayList edges;
static class Edge implements Comparable {
public int from;
public int to;
public int w;
public Edge(int from, int to, int w) {
this.from = from;
this.to = to;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return w - o.w;
}
}
static class UF {
int[] parent;
int[] rank;
public UF(int n) {
parent = new int[n + 1];
rank = new int[n + 1];
for (int i = 0; i <= n; i++) {
parent[i] = i;
rank[i] = 0;
}
}
public boolean isSameSet(int x, int y) {
return find(x) == find(y);
}
public int find(int v) {
while (parent[v] != v) {
parent[v] = parent[parent[v]]; // è·¯å¾å缩ä¼å
v = parent[v];
}
return v;
}
public void union(int a, int b) {
int aR = find(a);
int bR = find(b);
if (aR == bR)
return;
if (rank[aR] < rank[bR]) { // aæ´ç®,æä»¥æå°bæ´å¥½
parent[aR] = bR;
} else if (rank[aR] > rank[bR]) {
parent[bR] = aR;
} else {
parent[aR] = bR;
rank[bR]++;
}
}
}
static int kruskal() {
Collections.sort(edges); // 对边éæåº
UF uf = new UF(n);
int res = 0;
int count = 0;
for (int i = 0; i < edges.size(); i++) {
int from = edges.get(i).from;
int to = edges.get(i).to;
int w = edges.get(i).w;
if (!uf.isSameSet(from, to)) { //两个顶ç¹ä¸å±äºåä¸ä¸ªéå
res += w;
count++;
if (count == n - 1)
break;
uf.union(from, to);
}
}
return count == n - 1 ? res : -1;
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
while (in.hasNext()) {
m = in.nextInt(); // å
è¾å
¥éè·¯æ¡æ°
n = in.nextInt();
if (m == 0)
break;
edges = new ArrayList<>();
for (int i = 0; i < m; i++) {
int from = in.nextInt();
int to = in.nextInt();
int w = in.nextInt();
edges.add(new Edge(from, to, w));
edges.add(new Edge(to, from, w));
}
int res = kruskal();
System.out.println(res == -1 ? "?" : res);
}
}
}
```
`Prim`ç®æ³
```java
import java.util.*;
import java.io.*;
/**
* æå°çææ Prim
* é¢ç®ï¼http://acm.hdu.edu.cn/showproblem.php?pid=1863
*/
public class M23_MST_Prim {
static int n, m;
static boolean[] vis;
static ArrayList[] G;
static class Edge implements Comparable {
public int to;
public int w;
public Edge(int to, int w) {
this.to = to;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return w - o.w;
}
}
private static int prim(int start) {
PriorityQueue pq = new PriorityQueue<>();
for (int i = 0; i < G[start].size(); i++)
pq.add(G[start].get(i));
int count = 0;
int res = 0;
vis[start] = true; // èµ·å§èç¹å·²ç»å¨éåä¸
while (!pq.isEmpty()) {
Edge curEdge = pq.poll();
int to = curEdge.to;
if (!vis[to]) {
vis[to] = true;
count++;
res += curEdge.w;
if (count == n - 1)
break;
for (int i = 0; i < G[to].size(); i++) {
int nxtNode = G[to].get(i).to;
if (!vis[nxtNode]) // to -> nxtNode 没æå å
¥è¿
pq.add(G[to].get(i)); // å°to-> nxtNodeçè¾¹å å
¥ä¼å
éå
}
}
}
if (count != n - 1)
return -1;
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
while (in.hasNext()) {
m = in.nextInt(); // å
è¾å
¥éè·¯æ¡æ°
n = in.nextInt();
if (m == 0)
break;
G = new ArrayList[n + 1]; // 1~n
vis = new boolean[n + 1];
for (int i = 0; i <= n; i++)
G[i] = new ArrayList<>();
for (int i = 0; i < m; i++) {
int from = in.nextInt();
int to = in.nextInt();
int w = in.nextInt();
G[from].add(new Edge(to, w));
G[to].add(new Edge(from, w));
}
int res = prim(1);
System.out.println(res == -1 ? "?" : res);
}
}
}
```
## äºååãæçè·¯
è¿éåªç»åºæç»å
¸ç`Dijstra`ãå
¶ä»å¾å°èã
详解请ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Graph/%E6%9C%80%E7%9F%AD%E8%B7%AF/Hdu%20-%201874.%20%E7%95%85%E9%80%9A%E5%B7%A5%E7%A8%8B%E7%BB%AD(%E6%9C%80%E7%9F%AD%E8%B7%AFdijkstra%E6%A8%A1%E6%9D%BF).md)ã
```java
import java.util.*;
import java.io.*;
/**
* æçè·¯
* ä¾é¢: http://acm.hdu.edu.cn/showproblem.php?pid=1874
*/
public class M24_Dijkstra {
static int n;
static int m;
static boolean[] vis;
static ArrayList G[];
static class Edge implements Comparable {
public int to;
public int w;
public Edge(int to, int w) {
this.to = to;
this.w = w;
}
@Override
public int compareTo(Edge o) {
return w - o.w;
}
}
static int[] dijkstra(int start) {
PriorityQueue pq = new PriorityQueue<>();
int[] dis = new int[n];
for (int i = 0; i < n; i++) dis[i] = Integer.MAX_VALUE; //åå§æ è®°ï¼ä¸æ¯-1(å ä¸ºæ¯æ±æå°ç)ï¼
dis[start] = 0;
// G.vis[start] = true; //第ä¸ä¸ªè®¿é® start, ä¸è½å°startæ 记为true
pq.add(new Edge(start, 0)); //å°ç¬¬ä¸æ¡è¾¹å å
¥ pq, èªç¯è¾¹
while (!pq.isEmpty()) {
Edge curEdge = pq.poll();
int to = curEdge.to;
if (vis[to])
continue;
vis[to] = true;
for (int i = 0; i < G[to].size(); i++) { //æ´æ°ç¸é»çè¾¹
int nxtNode = G[to].get(i).to;
int nxtW = G[to].get(i).w;
if (!vis[nxtNode] && dis[nxtNode] > dis[to] + nxtW) {
dis[nxtNode] = dis[to] + nxtW;
pq.add(new Edge(nxtNode, dis[nxtNode])); //å°è¿ä¸ªæ°çdis[nxtNode]å å
¥ä¼å
éåï¼æ²¡å宿¯ä¸ä¸ä¸ª(å¾å°)
}
}
}
return dis;
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
while (in.hasNext()) {
n = in.nextInt();
m = in.nextInt();
G = new ArrayList[n]; // 0~n-1
vis = new boolean[n];
for (int i = 0; i < n; i++) {
G[i] = new ArrayList<>();
vis[i] = false;
}
for (int i = 0; i < m; i++) {
int from = in.nextInt();
int to = in.nextInt();
int w = in.nextInt();
G[from].add(new Edge(to, w));
G[to].add(new Edge(from, w));
}
int s = in.nextInt();
int e = in.nextInt();
int[] dis = dijkstra(s);
System.out.println(dis[e] == Integer.MAX_VALUE ? -1 : dis[e]);
}
}
}
```
## äºåäºã欧æåè·¯
欧æåè·¯ï¼
* 1)ãå¾Gæ¯è¿éçï¼ä¸è½æå¤ç«ç¹åå¨ã
* 2) å¯¹äºæ å徿¥è¯´åº¦æ°ä¸ºå¥æ°çç¹ä¸ªæ°ä¸º0ï¼å¯¹äºæå徿¥è¯´æ¯ä¸ªç¹çå
¥åº¦å¿
é¡»çäºåºåº¦ã
欧æè·¯å¾ï¼
* 1)ãå¾Gæ¯è¿éçï¼æ å¤ç«ç¹åå¨ã
* 2) ãåæ
åµ:
* å¯¹äºæ å徿¥è¯´:度æ°ä¸ºå¥æ°ççç¹å¯ä»¥æ2个æè
0个ï¼å¹¶ä¸è¿ä¸¤ä¸ªå¥ç¹å
¶ä¸ä¸ä¸ªä¸ºèµ·ç¹å¦å¤ä¸ä¸ªä¸ºç»ç¹ã
* å¯¹äºæå徿¥è¯´:å¯ä»¥åå¨ä¸¤ä¸ªç¹ï¼å
¶å
¥åº¦ä¸çäºåºåº¦ï¼å
¶ä¸ä¸ä¸ªå
¥åº¦æ¯åºåº¦å¤§1ï¼ä¸ºè·¯å¾çèµ·ç¹ï¼
å¦å¤ä¸ä¸ªåºåº¦æ¯å
¥åº¦å¤§1ï¼ä¸ºè·¯å¾çç»ç¹ã
夿è¿éå¯ä»¥ç¨`DFS`æè
å¹¶æ¥éã
```java
import java.io.*;
import java.util.*;
/**
* 欧æåè·¯åè·¯å¾ (1) ç¨dfså¤è¿é
* é¢ç®é¾æ¥: http://acm.hdu.edu.cn/showproblem.php?pid=1878
*/
public class M25_EulerCircuit_1 {
static ArrayList G[];
static int n, m;
static boolean[] vis;
static void dfs(int cur){
if(vis[cur]) return;
vis[cur] = true;
for(int to : G[cur]){
if(!vis[to])
dfs(to);
}
}
public static void main(String[] args){
Scanner sc = new Scanner(new BufferedInputStream(System.in));
PrintWriter out = new PrintWriter(System.out);
while(sc.hasNext()){
n = sc.nextInt();
if(n == 0) break;
m = sc.nextInt();
int[] in = new int[n+1];
vis = new boolean[n+1];
G = new ArrayList[n+1];
for(int i = 0; i <= n; i++) G[i] = new ArrayList<>();
for(int i = 0; i < m; i++){
int from = sc.nextInt();
int to = sc.nextInt();
G[from].add(to);
G[to].add(from);
in[from]++;
in[to]++;
}
dfs(1);
boolean ok = true;
for(int i = 1; i <= n; i++) if(in[i] % 2 != 0 || !vis[i]){
ok = false;
break;
}
out.println(ok ? "1" : "0");
out.flush();
}
out.close();
}
}
```
使ç¨å¹¶æ¥é夿è¿é:
```java
import java.io.*;
import java.util.*;
public class M25_EulerCircuit_2 {
static int n, m;
static int[] parent, rank;
static int findRoot(int p){
while(p != parent[p]){
parent[p] = parent[parent[p]];
p = parent[p];
}
return p;
}
static void union(int a, int b){
int aR = findRoot(a);
int bR = findRoot(b);
if(aR == bR) return;
if(rank[aR] < rank[bR]){
parent[aR] = bR;
}else if(rank[aR] > rank[bR]){
parent[bR] = aR;
}else {
parent[aR] = bR;
rank[bR]++;
}
}
public static void main(String[] args){
Scanner sc = new Scanner(new BufferedInputStream(System.in));
PrintWriter out = new PrintWriter(System.out);
while(sc.hasNext()){
n = sc.nextInt();
if(n == 0) break;
m = sc.nextInt();
int[] in = new int[n+1];
parent = new int[n+1];
rank = new int[n+1];
for(int i = 0; i <= n; i++) {
parent[i] = i;
rank[i] = 1;
}
for(int i = 0; i < m; i++){
int from = sc.nextInt();
int to = sc.nextInt();
union(from, to);
in[from]++;
in[to]++;
}
int oneRoot = findRoot(1);
boolean ok = in[1] % 2 == 0;
for(int i = 2; i <= n; i++) if(in[i] % 2 != 0 || findRoot(i) != oneRoot){
ok = false;
break;
}
out.println(ok ? "1" : "0");
out.flush();
}
out.close();
}
}
```
## äºåå
ãGCDåLCM
æ±æå¤§å
¬çº¦æ°åæå°å
¬åæ°ï¼å¾ç»å
¸äºï¼ç½ä¸æä¸ä¸å¾ç®åã
```java
import java.io.BufferedInputStream;
import java.util.Scanner;
/**
* æå¤§å
¬çº¦æ°åæå°å
¬åæ°é®é¢
* é¢ç®é¾æ¥: http://acm.hdu.edu.cn/showproblem.php?pid=1019
*/
public class M26_GCD_LCM {
// ééå½gcd
static int gcdIter(int a, int b){
int r;
while(b != 0){
r = a % b;
a = b;
b = r;
}
return a;
}
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
static int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
static int ngcd(int arr[], int n) {
if (n == 1) return arr[0];
return gcd(arr[n - 1], ngcd(arr, n - 1));
}
static int nlcm(int arr[], int n) {
if (n == 1) return arr[0];
return lcm(arr[n - 1], nlcm(arr, n - 1));
}
public static void main(String[] args){
Scanner in = new Scanner(new BufferedInputStream(System.in));
int T = in.nextInt();
for(int t = 0; t < T; t++){
int n = in.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++) a[i] = in.nextInt();
System.out.println(nlcm(a, n));
}
}
}
```
## äºåä¸ãç´ æ°çæ³
ä¸»è¦æ¯åå¼çæ³ã详解ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Math/Hdu%20-%201431%E7%B4%A0%E6%95%B0%E5%9B%9E%E6%96%87%E4%BB%A5%E5%8F%8A%E7%B4%A0%E6%95%B0%E7%9B%B8%E5%85%B3%E6%80%BB%E7%BB%93.md)ã
```java
import java.util.*;
import java.io.*;
public class M27_PrimeSieve {
// ç»å
¸çæ³ï¼è¶
æ¶
static ArrayList primary(boolean[] is_prime, int MAX) {
ArrayList prime = new ArrayList<>();
is_prime[0] = is_prime[1] = false; // 01 䏿¯ç´ æ°
boolean flag;
for (int i = 2; i <= MAX; i++) { //èå´æ¯1000 æçé 0~2000å
çç´ æ°
flag = true;
for (int j = 2; j * j <= i; j++) {// æ ¹å·içæ¶é´å¤æåº¦
if (i % j == 0) {
is_prime[i] = false;
flag = false;
break;
}
}
if (flag) {
prime.add(i);
is_prime[i] = true;
}
}
return prime;
}
//ç»å
¸çåå¼çæ³
static ArrayList sieve(boolean[] is_prime, int MAX) {
ArrayList prime = new ArrayList<>();
Arrays.fill(is_prime, true);
is_prime[0] = is_prime[0] = false;
for (int i = 2; i <= MAX; i++) {
if (is_prime[i]) {
prime.add(i);
for (int j = 2 * i; j <= MAX; j += i)
is_prime[j] = false;
}
}
return prime;
}
//ä¼åçæ³
static ArrayList sieve2(boolean[] is_prime, int MAX) {
ArrayList prime = new ArrayList<>();
Arrays.fill(is_prime, true);
is_prime[0] = is_prime[0] = false;
for (int i = 2; i <= MAX; i++) {
if (is_prime[i])
prime.add(i);
for (int j = 0; j < prime.size() && prime.get(j) <= MAX / i; j++) {
is_prime[prime.get(j) * i] = false; //çæ (å°äºçäºiçç´ æ° * i) ææçåæ°
if (i % prime.get(j) == 0) //妿 iæ¯ < içç´ æ°çåæ° å°±ä¸ç¨çäº
break;
}
}
return prime;
}
static boolean isPalindrome(int num) {
int oldNum = num;
int newNum = 0;
//åè¿æ¥è®¡ç®
while (num > 0) {
newNum = newNum * 10 + num % 10;
num /= 10;
}
return newNum == oldNum;
}
static final int maxn = 9989899; //é¢ç®ä¸æå¤§çåæç´ æ°
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
boolean[] is_prime = new boolean[maxn + 1];
// ä¸ç§çæ³å¯¹æ¯
// primary(is_prime,maxn); //è¶
æ¶
// sieve(is_prime,maxn); // ok
sieve2(is_prime, maxn); // ok fast
ArrayList res = new ArrayList<>();
for (int i = 0; i <= maxn; i++) {
if (is_prime[i] && isPalindrome(i))
res.add(i);
}
while (in.hasNext()) {
int a = in.nextInt();
int b = in.nextInt();
int num = 0;
for (int i = 0; i < res.size(); i++) {
num = res.get(i);
if(num >= a && num <= b) System.out.println(num);
}
System.out.println();
}
}
}
```
## äºåå
«ãå¯ä¸åè§£å®ç
è§£å³çé®é¢: **ä»»ä½ä¸ä¸ªå¤§äº1çèªç¶æ°Â Nï¼å¦æNä¸ä¸ºè´¨æ°ï¼é£ä¹Nå¯ä»¥å¯ä¸åè§£ææé个质æ°çä¹ç§¯**ã

代ç :
```java
import java.util.*;
import java.io.*;
/**
* å¯ä¸åè§£å®ç
* é¢ç®é¾æ¥: https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1634.html
*/
public class M28_UniqueDecomposition {
static ArrayList sieve(int MAX) {
ArrayList prime = new ArrayList<>();
boolean[] is_prime = new boolean[MAX + 1];
Arrays.fill(is_prime, true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= MAX; i++) {
if (is_prime[i]) {
prime.add(i);
for (int j = 2 * i; j <= MAX; j += i) {
is_prime[j] = false;
}
}
}
return prime;
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
PrintWriter out = new PrintWriter(System.out);
int T = in.nextInt();
for (int t = 0; t < T; t++) {
int n = in.nextInt();
ArrayList prime = sieve(n);
ArrayList res = new ArrayList<>();
//çé
for (int i = 0; i < prime.size(); i++) {
int p = prime.get(i);
while (n % p == 0) {
res.add(p);
n /= p;
}
}
out.print(res.get(0));
for(int i = 1; i < res.size(); i++) out.print("*" + res.get(i));
out.println();
out.flush();
}
out.close();
}
}
```
è¿éåéä¸ä¸ä¸ªçº¦æ°æä¸¾åæ´æ°åè§£ç代ç :
```java
import java.util.*;
/**
* çº¦æ°æä¸¾, æ´æ°åè§£
*/
public class M28_ApproximateNumberEnum {
//çº¦æ°æä¸¾
static ArrayList divisor(int n) {
ArrayList res = new ArrayList<>();
for (int i = 1; i * i <= n; i++) {
if (n % i == 0) {
res.add(i);
if (i != n / i)
res.add(n / i);
}
}
return res;
}
//æ´æ°åè§£
static HashMap prime_factor(int n) {
HashMap map = new HashMap<>();
for (int i = 2; i * i <= n; i++) {
while (n % i == 0) {
if (map.containsKey(i)) {
map.put(i, map.get(i) + 1);
} else {
map.put(i, 1);
}
n /= i;
}
}
if (n != 1) map.put(n, 1);
return map;
}
public static void main(String[] args) {
System.out.println(divisor(12));
System.out.println("----æµè¯åè§£ç´ å å(å¯ä¸åè§£å®ç)-----");
HashMap map = prime_factor(12);
for (Integer num : map.keySet())
System.out.println(num + " " + map.get(num));
}
}
```
## äºåä¹ã乿³å¿«éå¹
å
·ä½çè¿ç¯å客ï¼LeetCodeä¸ä¹åºç°è¿ï¼ä¹æ¯è¦ææ¡çã
[详解å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Math/%E4%B9%98%E6%B3%95%E5%BF%AB%E9%80%9F%E5%B9%82%E7%9B%B8%E5%85%B3%E6%80%BB%E7%BB%93%20%20%26%20LeetCode%20-%2050.%20Pow(x%2C%20n).md)ã
```java
import java.util.*;
import java.io.*;
/**
* 乿³å乿¹å¿«éå¹
* é¢ç®é¾æ¥: http://xyoj.xynu.edu.cn/problem.php?id=1872&csrf=mmofuzhUWGip3c6WlmhiFY6bLxeVHZta
*/
public class M29_QuickPow {
//éå½ è®¡ç® (a^n) % mod
static long pow_mod(long a, long n, long mod) {
if (n == 0) // a^0 = 1
return 1;
// å
æ±ä¸åç --> ä½ å
ç»ææ±åº a ^ (n/2) çç»æç»æ
long halfRes = pow_mod(a, n >> 1, mod); // n >> 1 --> n/2
long res = halfRes * halfRes % mod;
if ((n & 1) != 0) // odd num
res = res * a % mod;
return res;
}
//ééå½ è®¡ç® (a^n) % mod
static long pow_mod2(long a, long n, long mod) {
long res = 1;
while (n > 0) {
if ((n & 1) != 0) // äºè¿å¶æä½ä½ æ¯ 1 --> (n&1) != 0 --> ä¹ä¸ x ^ (2^i) (iä»0å¼å§)
res = res * a % mod;
a = a * a % mod; // a = a^2
n >>= 1; // n -> n/2 å¾å³è¾¹ç§»ä¸ä½
}
return res;
}
// è®¡ç® (a * b) % mod
static long mul_mod(long a, long b, long mod) {
long res = 0;
while (b > 0) {
if ((b & 1) != 0) // äºè¿å¶æä½ä½æ¯1 --> å ä¸ aç 2^i å, å¿«é广¯ä¹ä¸aç2^i ï¼
res = (res + a) % mod;
a = (a << 1) % mod; // a = a * 2 aéçbä¸äºè¿å¶ä½æ°èæ©å¤§ æ¯æ¬¡ æ©å¤§ä¸¤åã
b >>= 1; // b -> b/2 å³ç§» 廿æåä¸ä½ å 为å½åæåä¸ä½æä»¬ç¨å®äºï¼
}
return res;
}
//ééå½ è®¡ç® (a^n) % mod é
å mul
static long pow_mod3(long a, long n, long mod) {
long res = 1;
while (n > 0) {
if ((n & 1) != 0) // äºè¿å¶æä½ä½ æ¯ 1 --> (n&1) != 0 --> ä¹ä¸ x ^ (2^i) (iä»0å¼å§)
res = mul_mod(res, a, mod) % mod;
a = mul_mod(a, a, mod) % mod; // a = a^2
n >>= 1; // n -> n/2 å¾å³è¾¹ç§»ä¸ä½
}
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
int T = in.nextInt();
while (T-- > 0) {
int a = in.nextInt();
int n = in.nextInt();
int mod = in.nextInt();
// System.out.println(pow_mod(a,n,mod));
// System.out.println(pow_mod2(a,n,mod));
System.out.println(pow_mod3(a, n, mod));
}
}
}
```
## ä¸åãç©éµå¿«éå¹
乿¯å¾å¥½ç¨ç模æ¿ï¼è¯¦è§£ç[è¿ç¯å客](https://github.com/ZXZxin/ZXBlog/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%AE%97%E6%B3%95/Math/%E7%9F%A9%E9%98%B5%E7%9B%B8%E5%85%B3%E6%93%8D%E4%BD%9C%E5%92%8C%E7%9F%A9%E9%98%B5%E5%BF%AB%E9%80%9F%E5%B9%82.md)ã
```java
import java.util.*;
import java.io.*;
/**
* é¢ç®:http://poj.org/problem?id=3070
* ç»å
¸çææ³¢é£å¥æ°åé®é¢ f[n] = f[n-1] + f[n-2]
*/
public class M30_MatrixQuickPow {
static class Matrix {
public int row;
public int col;
public int[][] m;
public Matrix(int row, int col) {
this.row = row;
this.col = col;
m = new int[row][col];
}
}
static final int MOD = 10000;
static Matrix mul(Matrix a, Matrix b) {
Matrix c = new Matrix(a.row, b.col); //注æè¿é
for (int i = 0; i < a.row; i++) {
for (int j = 0; j < b.col; j++) {
for (int k = 0; k < a.col; k++)
c.m[i][j] = (c.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;
}
}
return c;
}
static Matrix pow(Matrix a, int k) {
Matrix res = new Matrix(a.row, a.col); // æ¹éµ
for (int i = 0; i < a.row; i++)
res.m[i][i] = 1;
while (k > 0) {
if ((k & 1) != 0)
res = mul(res, a);
a = mul(a, a);
k >>= 1;
}
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
while (in.hasNext()) {
int n = in.nextInt();
if (n == -1) break;
if (n == 0) {
System.out.println(0);
continue;
}
Matrix matrix = new Matrix(2, 2);
matrix.m[0][0] = matrix.m[0][1] = matrix.m[1][0] = 1;
matrix.m[1][1] = 0;
Matrix res = pow(matrix, n - 1);
System.out.println(res.m[0][0] % MOD);
}
}
}
```